题目描述

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

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

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

输入格式

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

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

输出格式

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

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

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

输入输出样例

输入 #1
5
HIGHHOPES
UP
LOWFEELINGS
UP
UPANDDOWN
DOWN
IAMSTILLSTANDING
DOWN
FOOLINGAROUND
DOWN
输出 #1
UPANDDOWN
IAMSTILLSTANDING
FOOLINGAROUND
HIGHHOPES
LOWFEELINGS

 题解:简单的队列应用恩。绿题

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
string d1[111],d2[111],f[111];
int up,down,now1,now2;
int n;
string s1,s2;
int main(){
    freopen("1159.in","r",stdin);
    freopen("1159.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s1>>s2;
        if(s2=="UP")   { up++; d1[up]=s1; }
        if(s2=="DOWN") { down++; d2[down]=s1; }
        if(s2=="SAME")  f[i]=s1;
    }
    for(int i=1;i<=n; i++) {
        if(f[i]!="")continue;
        else{
            if(now1<down) { now1++; f[i]=d2[now1]; }
            else { now2++; f[i]=d1[now2]; }
        }
    }
    for(int i=1;i<=n;i++)
        cout<<f[i]<<endl;
    return 0;
}
01-01 19:44