题意:
在数组里任选两个数字 将大的数字在前小的在后拼成一个数字(如:31和20 拼成3120) 这样往复的做 直到数组就剩一个元素 现给你这个最后的元素 问 数组最初最多能有多少个元素
思路:
明显的贪心 因为每次找两个数字去拼成一个大数字 所以我可以第一步拼成一个大数字 然后用这个数字当接下来选的两个数字中的大数字再拼 然后再选它当大数字再拼直到最后
因此贪心的去拼数字 其实就是扫一遍数组 如果能扫到末尾答案就出来了 如果中间发现前面的数字小了 其实说明你第一次拼的时候拼小了 更改开头重新拼即可
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[100010];
bool big(int s1,int s2)
{
if(s1+1>s2-s1) return true;
else if(s1+1<s2-s1) return false;
int i,j;
for(i=0,j=s1+1;i<=s1;i++,j++)
{
if(a[i]>a[j]) return true;
else if(a[i]<a[j]) return false;
}
return true;
}
int main()
{
char op;
int i,j,k,len,ans=1;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(i+1<len&&a[i+1]=='0') continue;
ans=1;
k=i;
for(j=k+1;j<len;j++)
{
if(j+1<len&&a[j+1]=='0') continue;
if(big(k,j))
{
ans++;
k=j;
}
else break;
}
if(k==len-1) break;
}
printf("%d\n",ans);
return 0;
}