标签:20.2 数字 int len1 -- flag printf 2022.3
键盘输入一个高精度的正整数 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;
}
标签:20.2,数字,int,len1,--,flag,printf,2022.3 来源: https://www.cnblogs.com/noname0974/p/16030250.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。