【TFLSnoi李志帅】第三篇文章---问题记录
P1106 删数问题
标签
进入讨论版
相关讨论
推荐题目
题目描述
键盘输入一个高精度的正整数NN(不超过250250位) ,去掉其中任意kk个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的NN和kk,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
nn (高精度的正整数)
kk(需要删除的数字个数)
输出格式
最后剩下的最小数。
输入输出样例
输入 #1
175438 4
输出 #1
13
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
分析
本题属于贪心,其算法思想是每一个局部问题都要得出最优解,从而得到全局最优解
老师代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char n[250]; 4 int s; 5 int main() 6 { 7 cin>>n>>s; 8 int len=strlen(n); //获取字符数组的长度 9 while(s--){ 10 for(int i=0; i<len; i++) 11 if(n[i]>n[i+1]){ //出现降序数字直间删掉 12 for(int j=i; j<len; j++){ 13 n[j]=n[j+1]; 14 } 15 break; 16 } 17 len--; //删掉后字符长度减一 18 } 19 20 //注意以下两种情况的特判 21 while(n[0]=='0'){ //删除若干字符后,可能会出现字符串首有若干0如:10002344 2 22 for(int j=0; j<len; j++) 23 n[j]=n[j+1]; 24 len--; 25 } 26 27 if(strlen(n)==0)cout<<0; //所有数字都被删除完了 如输入 1234 4 28 else cout<<n; 29 30 return 0; 31 }
输入输出:
————————————————————————————————————————————————————————————————————————
我的代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char a[300]; 6 int s,k; 7 cin>>a>>k; 8 s=strlen(a); 9 while(k--) 10 { 11 for(int i=0;i<s;i++) 12 if(a[i]>a[i+1]) 13 { 14 for(int j=i;j<s;j++) 15 a[i]=a[i+1]; 16 break; 17 } 18 s--; 19 } 20 while(a[0]=='0') 21 { 22 for(int j=0;j<s;j++)a[j]=a[j+1]; 23 s--; 24 } 25 if(s<1)cout<<"0"; 26 else 27 for(int i=0;i<s;i++)cout<<a[i]; 28 return 0; 29 }
输入输出:
???花式疑惑