淋漓盡致的貪心思想
波谷一定是一位數,波峯一位數不夠大的時候添加到兩位數就一定夠大了的。
當在尋找波谷碰到零了就自然當成波谷。
當在尋找波峯時碰到零時,將前面的波谷加到前一個波峯上,讓當前的零做波谷,使得波谷的值儘量小,這就是本題最關鍵的貪心思想,一直想不到。
代碼中:a表示前一個值,b表示當前考慮的值,tag爲偶數時表示正在尋找波谷,奇數時在尋找波峯。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
char data[5999];
int main()
{
int n, m, k;
while(scanf("%d", &n) != EOF)
{
scanf("%s", data);
//cout<<data<<endl;
int a, b, tag = 0;
a = 11;
b = 0;
int ans = 0;
for(int i = 0; i < n; i ++)
{
b = (data[i] - '0');
if(tag % 2 == 0){
if(b < a){
a = b;
}
else
{
i ++;
a = data[i]-'0';
}
}
else
{
if(b > a)
{
a = b;
}
else
{
if(b == 0)
{
while(data[i] == '0'){
i ++;
if(i >= n) break;
}
//貪心思想,有0就一定讓他做波谷,把原先的波谷a給到他的前一個波峯上
a = 0; //0做波谷
b = data[i]-'0';
a = b;
}
else
{
i ++;
a = b*10 + (data[i] - '0');
}
}
}
if(i >= n) break;
ans ++; tag ++;
}
printf("%d\n", ans-1);
}
return 0;
}