P1106删数游戏

这道题曾经在CQOJ上考过,是第二次做了。

这是一道使用字符串的贪心题。首先要根据机组例子来确定:删除递增序列的最后一位。即循环找到那一位后,把后面的数往前压。所以我在艰难处理完双重循环后(这个处理不是很顺畅),便卡在了前导零上四次(CQOJ的数据太水)。最后看了下题解,将前导零处理好了,AC。

1.注意前导零的处理:while到第一个不是零的,如到头,则cout<<"0"

2.将string在开始时便后移一位,不然别扭

3.想贪心策略时要多拿几个例子,找到规律

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
bool flag=false;
string a;
int s;
int len=0;
int i;
int main(){
    cin>>a;
    cin>>s;
    len=a.length();
    while(s){
        i=0;    
        while(a[i]<=a[i+1]){//停留在递增序列最后一位 
            i++;    
            }     
        while(i<=len-2){//往前压 
            a[i]=a[i+1];
            i++;
        }     
        len--;
        s--;
    }
    i=0;
    while(i<=len-1&&a[i]=='0')i++;//处理前导0 
    if(i==len)printf("0");
    else
        for(int j=i;j<=len-1;j++)
            printf("%c",a[j]); 

    return 0;
}
待到oi十一月,我花开后百花杀。
原文地址:https://www.cnblogs.com/china-mjr/p/11210058.html