您的位置:首页 > 其它

nyoj 448 删数字(思维水题)

2017-05-15 21:28 246 查看
寻找最大数

时间限制:1000 ms | 内存限制:65535 KB

难度:2

描述

请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888

输入

第一行输入一个正整数T,表示有T组测试数据

每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)

输出

每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数

样例输入

2

92081346718538 10

1008908 5

样例输出

9888

98

//贪心去删,每次删除第一个递减的数,这样可以使得前面的数尽可能的大

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char s[150];
int vis[150];

int main()
{
int t,m;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%s %d",s,&m);

int len = strlen(s);
int f=0,cnt=0;
memset(vis,0,sizeof(vis));

while(1)
{
f=0;
for(int j=0;j<len;j++)
{
if(vis[j]==0)
{
for(int k=j+1;k<len;k++)
{
if(vis[k]==0)
{
if(s[j] < s[k])
{
f=1;
cnt++;
vis[j]=1;
}
break;
}
}
}

if(f==1)
break;
}
if(f==0 || cnt==m)
break;
}

if(f==0 && cnt < m)
{
for(int i=len-1;i>=0;i--)
{
if(vis[i]==0)
{
vis[i]=1;
cnt++;
if(cnt==m)
break;
}
}
}

for(int i=0;i<len;i++)
if(vis[i]==0)
printf("%c",s[i]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: