此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=1106
题目描述
键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。
输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过250位) 输入数据均不需判错。
输入输出格式
输入格式:
n (高精度的正整数)
k (需要删除的数字个数)
输出格式:
最后剩下的最小数。
输入输出样例
输入样例#1:
175438 4
输出样例#1:
13 分析:虽然洛谷给的难度只有普及-,这题坑点还挺多的...贪心思路并不难,每次比较这个数字的第i位和i+1位,如果第i+1位的数字比第i位要小,显然可以把第i位删去。要注意的主要是两点,1.不要输出多余的前导0 2.如果所有非零数都被删去,输出0 AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 char a[255]; 7 int num[255]; 8 bool flag = false; 9 int main() 10 { 11 scanf("%s",a+1); 12 int n = strlen(a+1),k; 13 int len = n; 14 scanf("%d",&k); 15 for(int i = 1;i <= n;++ i) 16 num[i] = a[i]-‘0‘; 17 for(int i = 1;i <= k;++ i) 18 { 19 for(int j = 2;j <= len;++ j) 20 { 21 if(num[j] < num[j-1]) 22 { 23 num[j-1] = 0; 24 len --; 25 for(int r = j;r <= n;++ r) 26 num[r-1] = num[r]; 27 //把删除的空缺补起来 28 break; 29 } 30 } 31 } 32 for(int i = 1;i <= n-k;++ i) 33 {//复杂而丑陋的判断 34 if(num[i]) flag = true; 35 if(!flag && !num[i]) continue; 36 printf("%d",num[i]); 37 } 38 if(flag == false) 39 printf("0"); 40 return 0; 41 }
时间: 2024-10-20 15:44:30