排行榜
时间限制: 1 Sec 内存限制: 128 MB
提交: 45 解决: 14
[提交][状态][讨论版]
题目描述
小迈克尔住在一个小镇上,他喜欢看每周日下午发布的音乐电视评比。它每周都根据选票介绍相同的歌曲,列出这些歌曲的流行排行榜。
有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜。他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜。除了每首歌曲的 位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位,还是排名上升或排名下降,都会给出一 点说明。
编写程序,根据给定的流行榜帮助迈克尔推断出上周可能的排行榜。
有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜。他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜。除了每首歌曲的 位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位,还是排名上升或排名下降,都会给出一 点说明。
编写程序,根据给定的流行榜帮助迈克尔推断出上周可能的排行榜。
输入
第一行是一个整数N,1≤N≤100,表示排行榜上歌曲的总数。
接下来的N块列出了排行信息。每块有两行组成,第i块第一行是第i首歌曲的名称,歌名包括最多不超过100个英文大写字母,第二行包含下列三个单词中的一 个:UP(歌曲在排行榜上的位置上升),DOWN(歌曲在排行榜上的位置下滑)或SAME(排行不变),表示与上周排行榜相比,排行榜所发生的变动。
接下来的N块列出了排行信息。每块有两行组成,第i块第一行是第i首歌曲的名称,歌名包括最多不超过100个英文大写字母,第二行包含下列三个单词中的一 个:UP(歌曲在排行榜上的位置上升),DOWN(歌曲在排行榜上的位置下滑)或SAME(排行不变),表示与上周排行榜相比,排行榜所发生的变动。
输出
用N行输出一个上周可能的排行榜。
每一行包含一首歌名,即第i行包含排行榜上第i首歌的歌名。
注意:解不必是唯一的,但对于每一个测试数据都至少有一个解。
每一行包含一首歌名,即第i行包含排行榜上第i首歌的歌名。
注意:解不必是唯一的,但对于每一个测试数据都至少有一个解。
样例输入
5
HIGHHOPES
UP
LOWFEELINGS
UP
UPANDDOWN
DOWN
IAMSTILLSTANDING
DOWN
FOOLINGAROUND
DOWN
样例输出
UPANDDOWN
IAMSTILLSTANDING
FOOLINGAROUND
HIGHHOPES
LOWFEELINGS
【分析】先排位置不变的,再排下降的,再排上升的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=105; const int M=150005; int vis[N]; int id[N]; map<string,int>q; map<int,string>p; int n,m,x=1; int ans,maxn=0,sum=0; struct man { string name; string change; } a[N]; int dp[N]; int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { cin>>a[i].name>>a[i].change; if(a[i].change=="SAME")q[a[i].name]=i,p[i]=a[i].name,vis[i]=1; } for(int i=1; i<=n; i++) { if(a[i].change=="DOWN") { for(int j=x;; j++) { if(!vis[j]) { q[a[i].name]=j; p[j]=a[i].name; vis[j]=1; x++; break; } } } } for(int i=1; i<=n; i++) { if(a[i].change=="UP") { for(int j=x;; j++) { if(!vis[j]) { q[a[i].name]=j; p[j]=a[i].name; vis[j]=1; x++; break; } } } } for(int i=1;i<=n;i++)cout<<p[i]<<endl; return 0; }