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十一月,我花开后百花杀。