P1320 -- la
时间限制:1000MS
内存限制:131072KB
Description
la在纸条上把n个16进制数写成一行,由于某种原因只能保留k个,这k个数原来的相对次序保持不变,希望得到尽量大的数。
Input Format
包含多组测试数据。
每组测试数据,第一行是n, k,第二行是空格分开的n个16进制数。
Output Format
每组数据输出一行,表示最大的数字。注意:不含空格!
Sample Input
4 2 9 a b c 6 3 1 a 2 b 3 c
Sample Output
bc b3c
Hint
共有478组测试数据,每组n, k不超过10000。
【题解】
建一个栈,要让最后大,肯定是大的字符摆在前,如果当前字符大于栈顶元素,那么出栈。
要注意的是:如果一个元素出栈后,剩下凑不足k个,则不能出栈。
本题好!卡STL模板,我第一次提交用STL_stack,TLE了!
然后手写了栈(反正不难=-=),加了读入优化2.0,成功升至本题rank1.
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,top; char x; 4 char s[10010]; 5 char B[1<<15],*S=B,*T=B; 6 char getchar2() { 7 return S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++; 8 } 9 int read() { 10 int x=0,f=1; 11 char ch=getchar2(); 12 while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar2();} 13 while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar2();} 14 return x*f; 15 } 16 int main() { 17 for (int i=1;i<=478;++i) { 18 n=read();k=read(); 19 memset(s,0,sizeof(s)); 20 top=0; 21 for (int i=1;i<=n;++i) { 22 x=getchar2(); 23 getchar2(); 24 while (top&&x>s[top]&&top+n-i>=k) top--; 25 if(top<k) s[++top]=x; 26 } 27 for (int i=1;i<=k;++i) printf("%c",s[i]); 28 printf(" "); 29 } 30 }