[贪心][洛谷 P1106]删数问题
描述
键盘输入一个高精度的正整数 $N$,去掉其中任意 $k$ 个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的 $N$ 和 $k$ ,寻找一种方案使得剩下的数字组成的新数最小。
输出应包括所去掉的数字的位置和组成的新的整数。( $N$ 不超过 $250$ 位) 输入数据均不需判错。
输入
$n$(高精度的正整数)
$k$(需要删除的数字个数)
输出
最后剩下的最小数。
样例输入
175438
4
样例输出
13
这道题是贪心算法经典问题,思路:每次都选取一个使得剩下的数最小的数字。
注意:每次都选取最大的数字是错误的!
看到了吗?这就是后果!

废话不多说,代码简单易懂,直接上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char a[260],b[260],k[260];
int p;
scanf("%s",a);
cin>>p;
while(p>=1){
for(int i=0;i<strlen(a);i++){
strcpy(k,a);
for(int j=i;j<strlen(a);j++){
k[j]=k[j+1];
}
int j=0;
int d;
sscanf(k,"%d",&d);
if(d!=0){
while(k[j]=='0'){
for(int t=j;t<strlen(a)-1;t++){
k[t]=k[t+1];
}
j++;
}
}
if(i==0) {
strcpy(b,k);
continue;
}
if(strlen(b)>strlen(k)) {
strcpy(b,k);
continue;
}
if(strcmp(b,k)>0){
strcpy(b,k);
}
}
strcpy(a,b);
p--;
}
cout<<a;
}

浙公网安备 33010602011771号