寻找最大数
时间限制:1000 ms | 内存限制:65535 KB 难度:2描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888
输入
第一行输入一个正整数T,表示有T组测试数据每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证 数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入 292081346718538 101008908 5样例输出 988898 #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-pp是记录已经贪了多少字符了,每贪一个,就p--
错误代码:
看错题啦,按原次序,靠,必须是贪心#include<stdio.h>#include<string.h>//memset,gets#define N 101bool 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 /*这么规定的初衷有两个:
为了每一行都要以换行结束。
因为行尾的\表示连接下一行,如果一个文件最后一行行尾有\,那么,紧跟它也被包含进来的下一个源文件的第一行就会被连接!而如果一个文件以一个空行结束就会避免这种情况的发生。*/