Codeforces Round #292 (Div. 2) C. Drazil and Factorial(贪心Y

题目链接:

题意:定义了f(a)是正整数a中每一位数字的阶乘之和,求没有1,0数字且最大的b使得f(b)=f(a)

思路:可以用数组记录f(a)有哪些因数,而且让b最大,所以可以把非素数的因数分成素数因数,然后从高位到低位输出,有些细节还是要注意。

//Accepted 31 ms 4 KB#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define ll long long using namespace std;int cnt[11]; //记录每个因数有多少个 int date[11]; //取出一个数字的阶乘后,,更新cnt void dateup() //更新cnt {date[2]+=date[4]*2;date[2]+=date[6];date[3]+=date[6];date[2]+=date[8]*3;date[3]+=2*date[9];cnt[2]-=date[2];cnt[3]-=date[3];cnt[7]-=date[7];cnt[5]-=date[5];memset(date,0,sizeof(date));}int main(){ll n,m;scanf("%I64d",&n);scanf("%I64d",&m); //其实用字符串即可,反正只有15位用longlong也可while(m){int num=m%10;for(int i=2;i<=num;i++)cnt[i]++;m/=10;}cnt[2]+=cnt[4]*2;cnt[2]+=cnt[6];cnt[3]+=cnt[6];cnt[2]+=cnt[8]*3;cnt[3]+=2*cnt[9];while(cnt[7]–){printf("7");for(int i=2;i<7;i++) date[i]++;}dateup();while(cnt[5]–){printf("5");for(int i=2;i<5;i++) date[i]++;}dateup();while(cnt[3]–){printf("3");for(int i=2;i<3;i++) date[i]++;}dateup();while(cnt[2]–){printf("2");}puts("");return 0;}上面是中规中矩的写法,也可优化一下,不过可读性下降了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int main() {int n, num[11];char a[20];while(scanf("%d %s", &n, a) != EOF) {memset(num, 0, sizeof(num));for(int i = 0; i < n; i++) {if(a[i] != '0' || a[i] != '1') {if(a[i] == '6') {num[5]++;num[3]++;}else if(a[i] == '8') {num[2] += 3;num[7] ++;}else if(a[i] == '4') {num[2] += 2;num[3]++;}else if(a[i] == '9') {num[7]++;num[2]++;num[3]+=2;}else num[a[i] – '0']++;}}for(int i = 9; i >= 2; i–) {while(num[i]){printf("%d", i);num[i]–;}}printf("\n");}return 0;}

并且如此真实的活着——这,就是旅行的意义。

Codeforces Round #292 (Div. 2) C. Drazil and Factorial(贪心Y

相关文章:

你感兴趣的文章:

标签云: