題意:
喬治喜歡對他的數列 b 進行操作。 我們將喬治的數列表示成 b1, b2, ..., b|b| (其中 |b| 表示數列 b 的長度)。一次操作分爲以下幾個步驟:
- 選擇兩個不同的數 i 和 j (1 ≤ i, j ≤ |b|; i ≠ j),滿足 bi ≥ bj.
- 定義數 v = concat(bi, bj),其中 concat(x, y) 是將數 y 連接在數 x後面形成的新數。舉個例子,concat(500, 10) = 50010, concat(2, 2) = 22。
- 將數 v 加到數列的末尾。數列長度增加1。
- 將數列中第 i 項和第 j 項刪除。數列長度縮短 2 ,並且數列會被重新編號爲 1 到當前數列長度。
喬治進行了太多的操作使得數列 b 使得數列最終只存在一個數 p。現在喬治想知道,數列 b 最初最多能有幾個數?幫他求出答案。注意數列最初只能包含正整數。
Input
第一行包含一個整數 p (1 ≤ p < 10100000)。 保證數字 p 最高位不爲0。
Output
輸出一個整數 — 數列 b 最初的最長長度。
Example
Input
9555
Output
4
Input
10000000005
思路:
如果字符串中出現0的話肯定是和他前面第1個非0的數字組合的,單個的正整數自己爲一段,然後就可以將字符串分割爲幾段,從頭向後枚舉,如果之前已經組成的數字比當前的數字大,就直接合並,讓總共能成的段數加1,如果比當前的小則說明從開頭到當前的所有數字應該是在一個段中,否則的話當前這個數就要排在之前的數的前面,此時讓分段的數量爲1。
ac代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<unordered_map>
#define mod (1000000007)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
struct node{
int val,num;
}a[maxn];
char s[maxn];
int cnt=0,mx=0,mxa=0;
int main(){
scanf("%s",s);
for(int i=0;s[i];i++){
if(s[i]>'0')
a[cnt].num=0,a[cnt++].val=s[i]-'0';
else a[cnt-1].num++;
}
int ans=1;
mxa=a[0].val;mx=a[0].num;
for(int i=1;i<cnt;i++){
if(mx>a[i].num){
mx+=a[i].num+1,ans++;
}
else if(mx==a[i].num){
if(mxa>=a[i].val)
ans++;
else
ans=1;
mx+=a[i].num+1;
}
else {
mx+=a[i].num+1;ans=1;
}
}
printf("%d\n",ans);
return 0;;
}