删数问题(Noip1994)--贪心
【题目描述】 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。 输出新的正整数。(n不超过240位) 输入数据均不需判错。 【输入】 n s 【输出】 最后剩下的最小数。 【输入样例】 175438 4 【输出样例】 13
要考虑怎么删数是最小,这里的想法就是贪心;
从高位到低位看,如果高位大于低位,那么删掉高位的数:175438,1<7,不管;7>5,删掉7;15438,5>4,删5;
高位数越大,这个数就越大,所以我们要从高位来看,高位和下一位比较;
如果是递增的数,那么就删最后一位;位数变少,数字也会比删其他的要少;例如:123456;
#include <bits/stdc++.h> using namespace std; int main() { string a; int n,i,j,k; cin>>a>>n; int len=a.size(); for(k=0;k<n;k++) //这个循环控制删数的次数 { for(i=0;i<len-1;i++) //这个循环比较此位和下一位的大小 { if(a[i]>a[i+1]) //删数 { for(j=i;j<len-1;j++) a[j]=a[j+1]; break; //删完数后,应该跳出循环,进行下一次找数删数(break不能跳出if);n次删数; } } len--; //如果不满足条件 (都是递增的数),那么长度直接减1;适用于123456这种情况;其实不管满不满足比较的条件,长度都会减1 } i=0; while(i<=len-1&&a[i]=='0') i++;
if(i==len) cout<<"0"<<endl; else for(j=i;j<=len-1;j++) cout<<a[j]; return 0; }