题意:
给你一串数字,问你如何划分这些数字,使其按严格递减顺序,划分完后的数字个数最多是多少个。
思路:
由于不能有前导0,所以我们先把所有的数字单独划分出来。然后从头开始,枚举每一个数,并维护Max,若该数小于Max,则该数可以独立,ans++,并合并到Max中(由于题目所给的操作是允许不同数合并后成为新数去比较的),否则该数要和之前所有的数都合并,ans=1。注意:由于所给数字太大,得用字符串存放,这里得自己写一个字符串的比较函数cmp。
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int MAX=100005;
string s,a[MAX];
bool cmp(string a,string b){
int lena=a.size();
int lenb=b.size();
if(lena<lenb) return false;
else if(lena>lenb) return true;
else{
for(int i=0;i<lena;i++){
if(a[i]>b[i]) return true;
if(a[i]<b[i]) return false;
}
}
return true;
}
int main(){
cin>>s;
int len=s.size(),cnt=0;
for(int i=0;i<len;i++){
a[cnt]+=s[i];
while(s[i+1]=='0'){
a[cnt]+=s[i+1];
i++;
}
cnt++;
}
/*for(int i=0;i<cnt;i++){
cout<<a[i]<<endl;
}*/
string Max=a[0];
int ans=1;
for(int i=1;i<cnt;i++){
//cout<<i<<" "<<Max<<endl;
if(cmp(Max,a[i])) ans++;
else ans=1;
Max+=a[i];
}
cout<<ans<<endl;
return 0;
}