-贪心- [洛谷 P1106]删数问题

题目描述

键盘输入一个高精度的正整数 $N$,去掉其中任意 $k$ 个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的 $N$ 和 $k$ ,寻找一种方案使得剩下的数字组成的新数最小。

输出应包括所去掉的数字的位置和组成的新的整数。( $N$ 不超过 $250$ 位) 输入数据均不需判错。

输入格式

$n$(高精度的正整数)

$k$(需要删除的数字个数)

输出格式

最后剩下的最小数。

样例输入

175438

4

样例输出

13

Solution

这道题是贪心算法经典问题,思路:每次都选取一个使得剩下的数最小的数字。

注意:每次都选取最大的数字是错误的!

我因为这个错了5次

废话不多说,代码简单易懂,直接上代码

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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;
}
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2018/08/21/7/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论