排行榜

题目描述

小迈克尔住在一个小镇上,他喜欢看每周日下午发布的音乐电视评比。它每周都根据选票介绍相同的歌曲,列出这些歌曲的流行排行榜。

有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜。他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜。除了每首歌曲的位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位,还是排名上升或排名下降,都会给出一点说明。

编写程序,根据给定的流行榜帮助迈克尔推断出上周可能的排行榜。

输入格式

第一行是一个整数N(1≤N≤100),表示排行榜上歌曲的总数。

接下来的N块列出了排行信息。每块有两行组成,第i块第一行是第i首歌曲的名称,歌名包括最多不超过100个英文大写字母,第二行包含下列三个单词中的一个:UP(歌曲在排行榜上的位置上升),DOWN(歌曲在排行榜上的位置下滑)或SAME(排行不变),表示与上周排行榜相比,排行榜所发生的变动。

输出格式

N行输出一个上周可能的排行榜。

每一行包含一首歌名,即第i行包含排行榜上第ii首歌的歌名。

注意:解不必是唯一的,但对于每一个测试数据都至少有一个解。

输入输出样例

输入 #1

5
HIGHHOPES
UP
LOWFEELINGS
UP
UPANDDOWN
DOWN
IAMSTILLSTANDING
DOWN
FOOLINGAROUND
DOWN

输出 #1

UPANDDOWN
IAMSTILLSTANDING
FOOLINGAROUND
HIGHHOPES
LOWFEELINGS



分析:
锻炼思维的神题(反正我不会)
我考虑了两种做法,前一种错了,但是应该是由于题目没开SPJ,所以都介绍一下。

(1)

我自己拿到题时考虑的,首先对于UP我们把他们放到最后,其次对于DOWN我们放到他们前面最近的空位上,最后对于SAME不修改。
代码也较好写,就是N^2的暴力,期望:100,实际:0(huaji):
CODE1:
 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int M=205;
 8 int n;
 9 int pos[M];
10 string name[M];
11 int t[M];
12 string x[M];
13 int get(){
14     int res=0,f=1;
15     char c=getchar();
16     while (c>'9'||c<'0') {
17         if (c=='-') f=-1;
18         c=getchar();
19     }
20     while (c<='9'&&c>='0'){
21         res=(res<<3)+(res<<1)+c-'0';
22         c=getchar();
23     }
24     return res*f;
25 }
26 int main(){
27     n=get();
28     for (int i=1;i<=n;i++){
29         cin>>name[i];
30         cin>>x[i];
31         if (x[i]=="UP") t[i]=1;
32         if (x[i]=="DOWN") t[i]=2;
33         if (x[i]=="SAME") t[i]=0,pos[i]=i;
34     }
35     for (int i=1;i<=n;i++){
36         if (t[i]==0) continue;
37         if (t[i]==2){
38             for (int j=i-1;j>=1;j--)
39             if (pos[j]==0) {pos[j]=i;break;}
40         }
41         else {
42             for (int j=n;j>=1;j--)
43             if (pos[j]==0) {pos[j]=i;break;}
44         }
45     }
46     for (int i=1;i<=n;i++) cout<<name[pos[i]]<<endl;
47     return 0;
48 }

(2)

看了题解后明白的,本题数据也就是按这种方法出的,但是没加SPJ。

本题的标解(注意不是正解)要利用到queue的性质:先进先出。

对于UP和DOWN各开一个queue记录,这样我们对于每一位处理时只需要先取UP再取DOWN即可。:

CODE2:

 
 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 const int M=205;
 9 int n;
10 string name[M];
11 bool flag[M];
12 string x[M];
13 queue<int> a1,a2;
14 int get(){
15     int res=0,f=1;
16     char c=getchar();
17     while (c>'9'||c<'0') {
18         if (c=='-') f=-1;
19         c=getchar();
20     }
21     while (c<='9'&&c>='0'){
22         res=(res<<3)+(res<<1)+c-'0';
23         c=getchar();
24     }
25     return res*f;
26 }
27 int main(){
28     n=get();
29     for (int i=1;i<=n;i++){
30         cin>>name[i];
31         cin>>x[i];
32         if (x[i]=="UP") a2.push(i);
33         if (x[i]=="DOWN") a1.push(i);
34         if (x[i]=="SAME") flag[i]=true;
35     }
36     for (int i=1;i<=n;i++){
37         if (flag[i]) {cout<<name[i]<<endl;continue;}
38         if (!a1.empty()) cout<<name[a1.front()]<<endl,a1.pop();
39         else if (!a2.empty()) cout<<name[a2.front()]<<endl,a2.pop();
40     }
41     return 0;
42 }
 
 
 

猜你喜欢

转载自www.cnblogs.com/kanchuang/p/11495242.html