cf C. George and Number
http://codeforces.com/problemset/problem/387/C
题意:给你一个大数,让你求个集合,可以通过操作得到这个数,求集合中个数最大值,操作 :从集合中任意取两个数,大的数放在前面小的数放在后面组成一个数在重新放入集合中,经过重复的操作,集合中只剩一个数,这个数就是给你的数。
思路:要求个数最大,可以让这个大数的每一个数字为集合中的一个数,但是集合中不能有0,所以在连续的0前面要连着一个非零的数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 char str[1000000]; 7 8 int main() 9 { 10 while(scanf("%s",str)!=EOF) 11 { 12 int k=strlen(str); 13 int ans=0; 14 for(int i=k-1; i>=0; i--) 15 { 16 int j=i; 17 while(str[i]=='0') i--; 18 if(j-i+1<i) ans++; 19 else if(j-i+1==i) 20 { 21 bool flag=false; 22 for(int k=0; k<i; k++) 23 { 24 if(str[k]>str[k+i]&&str[k]!=str[k+i]) 25 { 26 flag=true; 27 ans++; 28 break; 29 } 30 else if(str[k]<str[k+i]&&str[k]!=str[k+i]) 31 { 32 ans++; 33 i=0; 34 flag=true; 35 break; 36 } 37 } 38 if(!flag) ans++; 39 } 40 else if(j-i+1>i) 41 { 42 i=0; 43 ans++; 44 } 45 } 46 printf("%d\n",ans); 47 } 48 return 0; 49 }