[FZYZOJ 1320] la

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("\n");
29     }
30 }
View Code

 

posted @ 2015-06-10 21:11  TonyFang  阅读(375)  评论(0编辑  收藏  举报