1106 删数问题
难度:普及/提高-
题目类型:贪心
提交次数:3
涉及知识:字符串、贪心
题目描述
键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。
输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过250位) 输入数据均不需判错。
代码:
#include<iostream> #include<cstring> using namespace std; int main(){ string s; cin>>s; int k; cin>>k; int n = 0; int i = 0; //cout<<bool(i<=s.length()-2)<<endl; while(n<k&&i<s.length()-1){ i++; if(s[i-1]>s[i]){ s.erase(i-1,1); n++; i=0; } } //cout<<k-n<<endl; for(i = 0; i < k-n; i++) s.erase(s.length()-1, 1); for(i = 0; i < s.length(); i++){ if(s[i]!='0') { cout<<s.substr(i, s.length()-i); return 0; } } if(i==s.length())cout<<'0'; return 0; }
备注:
感觉被诅咒一样,这道题写的特别费劲。基本思路就是贪心,找到降序就删掉第一个,然后再从头找。最开始是i、n应该是1还是0,在什么位置加1,加1还是减1还是不加不减这种小细节搞了半天,感觉智商被掏空。字符串函数用的还是不熟练,多写写就好了。另外要注意的关键就是先导0问题。ps:字符0和数字0不一样,所以不能用if(s[i])判断。另外有一个诡异的问题,就是注释的第一行,由于老师出去约饭去了,正在等待老师解答中。
得到老师解答,很神奇,s.length()的返回值的是无符号数,负数和无符号数比就出问题啦。