2022.3.20.2

键盘输入一个高精度的正整数 N(不超过 250位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。

编程对给定的 N 和 k,寻找一种方案使得剩下的数字组成的新数最小。

看似很简单的贪心题,实际上有点小坑专门卡我这种菜鸡。

首先,肯定不能直接找每轮最大的数字删除,这样肯定不对。反例:8119  1   应删除8而不是9。

所以需要找规律,我刚开始虽然发现了应该有权重的问题,但是我不会。。。

借用别人的思路:

1   4  1  5  1   9

小 大 小 大 小 大

留 删 留删 留 留

可以发现,删除的数应该是每一轮的第一个山峰。即a[i]>a[i+1]

尽管如此,这样还是不可以ac。 反例:11111 1

所以在每一轮再引入一个标志量flag,就可以过了

#include<cstdio>
#include<cstring>
using namespace std;
char a[280];
int main()
{
int len1,k,i;
int flag;
scanf("%s",a);
scanf("%d",&k);
len1=strlen(a);
while(k--)
{
flag=0;
for(i=0;i<len1;i++)
{
if(a[i]>a[i+1])
{
flag=1;
for(int j=i;j<len1;j++)
a[j]=a[j+1];
len1--;
break;
}
}
if(!flag)
{
a[len1-1]='\0';
len1--;
}
}
i=0;
while(i<len1&&a[i]=='0')
i++;
if(i==len1)
printf("0");
else
for(int j=i;j<len1;j++)
printf("%c",a[j]);
printf("\n");
return 0;
}

posted @ 2022-03-20 15:53  noname5588  阅读(49)  评论(0)    收藏  举报