排行榜

排行榜

题目描述

小迈克尔住在一个小镇上,他喜欢看每周日下午发布的音乐电视评比。它每周都根据选票介绍相同的歌曲,列出这些歌曲的流行排行榜。
有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜。他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜。除了每首歌曲的位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位,还是排名上升或排名下降,都会给出一点说明。
编写程序,根据给定的流行榜帮助迈克尔推断出上周可能的排行榜。

输入

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

输出

用N行输出一个上周可能的排行榜。
每一行包含一首歌名,即第i行包含排行榜上第i首歌的歌名。
注意:解不必是唯一的,但对于每一个测试数据都至少有一个解。

样例输入

5
HIGHHOPES
UP
LOWFEELINGS
UP
UPANDDOWN
DOWN
IAMSTILLSTANDING
DOWN
FOOLINGAROUND
DOWN

样例输出

UPANDDOWN
IAMSTILLSTANDING
FOOLINGAROUND
HIGHHOPES
LOWFEELINGS
分析:先把排名不变的占了,然后从前往后优先占排名掉的,再占排名升的;
代码:
#include <bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
int n,m,k,t,p,q;
string a[maxn],b[maxn],ans[maxn];
string now,qq;
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        cin>>now>>qq;
        if(qq=="UP")b[q++]=now;
        else if(qq=="SAME")ans[i]=now;
        else   a[p++]=now;
    }
    int now1=0,now2=0;
    for(i=1;i<=n;i++)
    {
        if(ans[i]=="")
        {
            if(now1<p)ans[i]=a[now1++];
            else ans[i]=b[now2++];
        }
    }
    for(i=1;i<=n;i++)cout<<ans[i]<<endl;
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/5769192.html