一年的省赛题目。
先容我骂一下,这题目有病吧,我调试了一个下午+晚上,好不容易才顺利A了,真是坑。
比赛中能做出来的那绝对是厉害啊!!。
我的思路,方法可能有笨:
1.首先判断下有几个0,有一个0的话,
一 。判断0后面有没有比9小的数,有的话那个数加1就可以直接输出了。
二 。如果0是最后一位,前面有比9小的数,那个数+1,后面全输出0即可
三 。如果0是最后一位,前面没有比9小的那直接在最前面加1,后面全输出0即可。
四 。如果0后面没有比9小的,那直接把0位置变成1,后面都变成0输出即可。
2.如果是有多个0的话
一。如果在最右0之后有比9小的数,那直接那个数+1 输出答案即可。
二。如果没有的话,那就直接把这个位置的0变成1,后面全部输出0即可。
3。就是比较一般的情况
这种是比较简单的。统计因子2 3 5 7 出现的次数。
因为4可以由 2×2 组成,6可以由 2×3 组成 8 9都可以组成,所以只要保留素数因子即可。
然后直接从后往前面遍历,用直接已经有的因子数,看能不能组成比这个大的,如果可以的话,高位直接不动,这个位置变成这个数。
然后从最后一位开始,把当前拥有因子能组成的最大数组合起来,一个一个往前放,没有因子的话,那都放1就可以了,然后输出答案即可。
如果都没有可能的话,那在这个数前面加1即可。!!!!!!!!!!
!!!!!!!!
比如111126
一开始 a[2]=a[3]=a[5]=a[7]=0;
然后6遍历到6,a[2]++,a[3]++;
因为没有能组成比6 大.
然后遍历2这个时候a[2]=2,a[3]=1;
能组成3那这个位置就放3此时a[2]=2,a[3]=0;
最后一个变成4输出答案即可。
上代码!
#include<string> #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[15],b[15]; int f() { if(a[3]>=2) { a[3]-=2; return 9;} else if(a[2]>=3) { a[2]-=3; return 8;} else if(a[7]>=1) { a[7]-=1; return 7;} else if(a[2]>=1&&a[3]>=1) { a[2]-=1; a[3]-=1;return 6;} else if(a[5]>=1) { a[5]-=1; return 5; } else if(a[2]>=2) { a[2]-=2; return 4; } else if(a[3]>=1) { a[3]-=1; return 3; } else if(a[2]>=1) { a[2]-=1; return 2; } else return 1; } int fit(int num) { if(num==9&&a[3]>=2) { return 1; } else if(num==8&&a[2]>=3) { return 1; } else if(num==7&&a[7]>=1) { return 1;} else if(num==6&&a[3]>=1&&a[2]>=1) { return 1; } else if(num==5&&a[5]>=1) { return 1;} else if(num==4&&a[2]>=2) { return 1;} else if(num==3&&a[3]>=1) { return 1; } else if(num==2&&a[2]>=1) { return 1;} else return 0; } void add(int num) { if(num%2==0) { if(num==6) { a[2]++; a[3]++; return ; } int temp=num; while(temp!=1&&temp%2==0) { a[2]++; temp/=2; } } else if(num%3==0) { int temp=num; while(temp!=1&&temp%3==0) { a[3]++; temp/=3; } } else if(num%5==0) { int temp=num; while(temp!=1&&temp%5==0) { a[5]++; temp/=5; } } else if(num%7==0) { int temp=num; while(temp!=1&&temp%7==0) { a[7]++; temp/=7; } } } void dd(int num) { if(num%2==0) { if(num==6) { a[2]--; a[3]--; return ;} int temp=num; while(temp!=1&&temp%2==0) { a[2]--; temp/=2; } } else if(num%3==0) { int temp=num; while(temp!=1&&temp%3==0) { a[3]--; temp/=3; } } else if(num%5==0) { int temp=num; while(temp!=1&&temp%5==0) { a[5]--; temp/=5; } } else if(num%7==0) { int temp=num; while(temp!=1&&temp%7==0) { a[7]--; temp/=7; } } } int main() { //freopen("in","r",stdin); //freopen("out","w",stdout); int n; scanf("%d",&n); getchar(); for(int ww=1; ww<=n; ww++) { char str[10005]; gets(str); int i,l=strlen(str); int num[10005],flag=0; for(i=0; i<l; i++) { num[i]=str[i]-‘0‘; if(num[i]==0) flag++; } for(i=0; i<10; i++) a[i]=0; int rere; if(flag==1) { int ff=0,f_f; for(i=l-1; i>=0; i--) { if(num[i]!=0) { if(num[i]<9) { ff=1; rere=i; break; } } else{ f_f=i; } } if(ff) { if(f_f<rere){ num[rere]++; for(i=0; i<=rere; i++) printf("%d",num[i]); for(; i<l; i++) printf("0"); } else{ if(f_f!=l-1){ num[f_f]=1; for(i=0;i<=f_f;i++) printf("%d",num[i]); for(;i<l;i++) printf("0"); } else{ num[rere]++; for(i=0; i<=rere; i++) printf("%d",num[i]); for(; i<l; i++) printf("0"); } } } else { if(f_f==l-1) { printf("1"); for(i=0; i<l; i++) printf("0"); } else{ num[f_f]=1; for(i=0;i<=f_f;i++) printf("%d",num[i]); for(;i<l;i++) printf("0"); } } } else if(flag>1) { int ff=0; for(i=l-1; i>=0; i--) { if(num[i]==0) { num[i]++; ff=1; rere=i; break; } if(num[i]!=0) { if(num[i]<9) { num[i]++; ff=1; rere=i; break; } } } if(ff) { for(i=0; i<=rere; i++) printf("%d",num[i]); for(; i<l; i++) printf("0"); } else { printf("1"); for(i=0; i<l; i++) printf("%d",num[i]); } } else { int j,fnow=0; for(i=l-1; i>=0; i--) { add(num[i]); for(j=num[i]+1;j<=9;j++){ if(fit(j)){ num[i]=j; dd(j); for(j=l-1;j>i;j--){ num[j]=f(); } fnow=1; break; } } if(fnow) break; } if(fnow) { for(i=0; i<l; i++) printf("%d",num[i]); } else { printf("1"); for(i=0; i<l; i++) printf("%d",num[i]); } } printf("\n"); } return 0; }
zoj 3327 Friend Number 模拟题,布布扣,bubuko.com
原文:http://blog.csdn.net/cnh294141800/article/details/23203947