http://acm.hdu.edu.cn/showproblem.php?pid=4105
主流做法DP,这里写了一个贪心。。。。
贪心在于每个一个波谷都只用一位数,波峰尽量用一位数(前导0不算。。)
b保存的是当前波谷的值,c保存的是当前波峰的值。
f=false表示当前要求波谷了。
难想的地方在于几个else,1处else表示让前面的波峰再增加一位数,这样多位的波峰必然大于下一位的一位的波谷。2处else(当前要求波峰)后面的括号中,前面部分表示把前面一个波谷b这一位给此波谷前面的波峰,然后把0给b作为波谷,再把第一位非0的数字作为波峰。后面的部分,即3处else表示c要用2位数来做波峰。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char a[5000];
int main()
{
int i,j,k,n,m,b,c;
while (1)
{
if (scanf("%d",&n)==EOF) break;
scanf("%s",a);
for (i=0;i<n;i++) a[i]-='0';
bool f=false;
int ans=0;
b=0;
c=10;
for (i=0;i<n;i++)
{
if (f==false)
{
if (c>a[i]) b=a[i];
else//1
{
i++;
b=a[i];
}
}
else
{
if (a[i]>b) c=a[i];
else//2
{
if (a[i]==0)
{
while (a[i]==0) i++;
b=0;
c=a[i];
}
else//3
{
i++;
c=a[i-1]*10+a[i];
}
}
}
if (i>=n) break;
ans++;f=!f;
}
cout<<ans-1<<endl;
}
return 0;
}