http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1312
1312: 榜单
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 84 [Submit][Status][Web Board]
Description
ZZY很喜欢流行音乐,每周都要跟踪世界各地各种榜单,例如Oricon和Billboard,现在给出每周各个单曲的销量请给出每周的TOP5以及TOP5中各个单曲的浮动情况。
量的排名是按照本周销量排名,而不是总销量。
浮动情况则是较上周的排名变动,也就是说即使某单曲本周销量比上周的差,但排名比上周高,也是*UP*。反之若排名比上周低则为*DOWN*。若与上周的名次一样,则是*STAY*。
若是本周发行的新单(前面未有统计过销量),则浮动的情况为*NEW*。所以第一周所有单的情况都为*NEW*。
Input
多组数据,每周第一行输入为一个正整数N(5<=N<=10)表示当周统计了销量的专辑数,当N=0时结束输入。(不超过10周)
每周的单曲名字都是不超过30位的字符串(不会有空格,连续的串),名字后面跟的就是销量,单周最大销量不超过200万张。并且在不同周,相同的专辑名字一定是一模一样(相同的字符串)。
每周不会出现两个单曲销量相同。
本周没有统计前面某个已存在单曲的销量则说明本周其销量小得可以忽略,为0。
Output
第一组数据为第一周,第二组数据为第二周,以此类推。
每周数据第一行为WEEK k其中k为周数,WEEK k的左右两边各16个'-'。
紧接着五行,依次为top1~top5。
先输出当前是第几名"rank.",再接着当前名次单曲较上周的浮动情况。
*DOWN*与*STAY*后面空两格格输出单曲名,*NEW*后面空三格输出单曲名,*UP*后面空四格输出单曲名。
每行输出完单曲名后不要输出多余空格。
具体输出格式细节参考样例。
Sample Input
6
AKB48-Give_me_Five 1200000
Adele-Set_Fire_To_The_Rain 900000
Katy_Perry-Part_Of_Me 400000
KANA-Sakura,I_love_you 360000
Nicki_Minaj-Starships 300000
AAA-SAILING 350000
5
KAT_TUN-CHAIN 550000
Adele-Set_Fire_To_The_Rain 850000
AKB48-Give_me_Five 500000
KANA-Sakura,I_love_you 300000
Nicki_Minaj-Starships 290000
0
Sample Output
----------------WEEK 1----------------
1.*NEW* AKB48-Give_me_Five
2.*NEW* Adele-Set_Fire_To_The_Rain
3.*NEW* Katy_Perry-Part_Of_Me
4.*NEW* KANA-Sakura,I_love_you
5.*NEW* AAA-SAILING
----------------WEEK 2----------------
1.*UP* Adele-Set_Fire_To_The_Rain
2.*NEW* KAT_TUN-CHAIN
3.*DOWN* AKB48-Give_me_Five
4.*STAY* KANA-Sakura,I_love_you
5.*UP* Nicki_Minaj-Starships 【题解】:
模拟题
【code】:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector> using namespace std; struct Nod
{
char name[];
int id;
int sum;
}node[]; vector<Nod> vct;
int tn; bool cmp(Nod a,Nod b)
{
return a.sum>b.sum;
} int isExist(int j)
{
int i,cnt=;
for(i=vct.size()-;i>=;i--)
{
cnt++;
if(strcmp(node[j].name,vct[i].name)==)
{
if(cnt<=tn)
{
node[j].id = vct[i].id;
}
else node[j].id = ;
return ;
}
}
return ;
} int main()
{
int n,week=;
tn=-;
while(~scanf("%d",&n)&&n)
{
int i;
for(i=;i<n;i++)
{
scanf("%s%d",node[i].name,&node[i].sum);
}
sort(node,node+n,cmp);
printf("----------------WEEK %d----------------\n",week++);
for(i=;i<;i++)
{
printf("%d.",i+);
if(!isExist(i)) printf("*NEW* ");
else if(node[i].id>i) printf("*UP* ");
else if(node[i].id<i) printf("*DOWN* ");
else printf("*STAY* ");
printf("%s\n",node[i].name);
}
for(i=;i<n;i++)
{
node[i].id = i;
vct.push_back(node[i]);
}
tn=n;
}
return ;
}