2015年2月20日 星期五

[CF 516A] Drazil and Factorial

作法:

用貪心,可以把2 ~ 9 的階乘都拆成幾個 2! , 3! , 5! , 7! 的乘積,並且可以知道最佳解裡面所有數字一定都是 2 , 3 , 5 , 7 ,因為如果有其它的數字就可以再拆開,得到更大的數。而可以得到 7! 的個數必需要等於原本數字裡面的數碼>=7 的個數,而當 7! 確定之後 5! 的個數也確定了,剩下 2! 和 3! 的個數,解聯立就解的出來要取幾個,所以這樣取會是最佳的。

code :

#include<bits/stdc++.h>
#define LL long long
using namespace std;
 
int num[5],p[]={2,3,5,7} ;
char s[20] ;
main()
{
    int n ; scanf("%d%s",&n,s+1) ;
    for(int i=1;i<=n;i++)
    {
        int x=s[i]-'0' ;
        if(x>=7)
        {
            num[3]++ ;
            if(x==8) num[0]+=3 ;
            if(x==9) num[1]+=2 , num[0]++ ;
        }
        else if(x>=5)
        {
            num[2]++ ;
            if(x==6) num[1]++ ;
        }
        else if(x>=3)
        {
            num[1]++ ;
            if(x==4) num[0]+=2 ;
        }
        else if(x==2) num[0]++ ;
    }
    for(int i=3;i>=0;i--) while(num[i]--) printf("%d",p[i]) ;
    printf("\n") ;
}
 

沒有留言:

張貼留言