NYOJ 448(贪心)

寻找最大数
时间限制: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>//memset,gets
#define N 110
//bool visit[N];//以防两数在两个区间都是最大值
char str[N];
int main()
{
int i;
int m,n,max, start,T,p;
//memset(str,0,sizeof(str));//否则用strlen不准确
scanf("%d",&T);
while(T--)
{
//memset(visit,0,sizeof(visit));
while(1)
{
scanf("%s %d",str,&n);//题目有要求首位不为0
if(str[0]!=0)
break;
}
//gets(str);
//for(i=1;i<=m;i++)‘’;,
//scanf("%c",&str[i]);
m=strlen(str);
p=m-n;
start=0;
while(p)
{
max='0'-1;
for(i=start; i<=m-p; i++)
{
if(max<str[i])
{
max = str[i];
start = i+1;
}
//visit[start] = true;
}
printf("%c",max);//不是%d
--p;
}printf("\n");
//for(i=0;i<l;i++)
//if(visit[i])
/*例如56853217 5,第一次出来8,第二次应该是6,而
6在8前面,所以输出语句应该在for内,不应该在用上面我屏蔽掉的for */
//putchar("\n");
}
return 0;
}

/*注意:把l改成p把,免得l和1分不清
贪心,每次在能够贪的区间找出最大字符,然后记录下一次是从最大字符的下标+1开始,所以start =
i+1
下次能贪的区间也就是:start ~ m-p
p是记录已经贪了多少字符了,每贪一个,就p--

错误代码:


看错题啦,按原次序,靠,必须是贪心
#include<stdio.h>
#include<string.h>//memset,gets
#define N 101
bool visit[N];//以防两数在两个区间都是最大值
char str[N];
bool Max(char a,char b)
{
if(a>=b)
return true;
return false;
}
int main()
{
int i,j;int T,l;int m,n,max;
memset(visit,0,sizeof(visit));
//memset(str,0,sizeof(str));//否则用strlen不准确
scanf("%d",&T);
while(T--)
{
while(1)
{
scanf("%s %d",str,&n);//题目有要求首位不为0
if(str[0]!=0)
break;
}
//gets(str);
//for(i=1;i<=m;i++)
//scanf("%c",&str[i]);
l=strlen(str);
for(i=0;i<l-n;i++)
{
max='0';
for(j=i;j<n+1+i;j++)
if(Max(str[j],max)&&!visit[j])
max=str[j];
visit[j-1]=true;
printf("%c",max);//不是%d
}
//for(i=0;i<l;i++)
//if(visit[i])
/*例如56853217 5,第一次出来8,第二次应该是6,而
6在8前面,所以输出语句应该在for内,不应该在用上面我屏蔽掉的for */

//putchar("\n");
printf("\n");
}
return 0;
}


//.cpp:56 [Warning] no newline at end of file
/*
这么规定的初衷有两个:

为了每一行都要以换行结束。
因为行尾的\表示连接下一行,如果一个文件最
后一行行尾有\,那么,紧跟它也被包含进来的下一个源文件的第一行就会
被连接!而如果一个文件以一个空行结束就会避免这种情况的发生。*/

原文地址:https://www.cnblogs.com/hxsyl/p/2453481.html