码迷,mamicode.com
首页 > 其他好文 > 详细

[FZYZOJ 1320] la

时间:2015-06-10 22:31:55      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

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

 

[FZYZOJ 1320] la

标签:

原文地址:http://www.cnblogs.com/TonyNeal/p/fzyzoj1320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!