CSU1312:榜单(模拟)

Description

ZZY很喜欢流行音乐,每周都要跟踪世界各地各种榜单,例如OriconBillboard,现在给出每周各个单曲的销量请给出每周的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
 
模拟题,需要注意的是,以前操作过的每首歌曲都是存在的,而不只是根据上一组来判定
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct node
{
    char name[50];
    int num;
    int no;
} now[30];

struct kode
{
    char name[50];
    int num;
    int no;
} before[300];

int cmp(node x,node y)
{
    return x.num>y.num;
}

int cmp2(kode x,kode y)
{
    return x.num>y.num;
}

int main()
{
    int n,i,week = 0,m = 0,j;
    //m是记录所有曾经出现过的歌曲的数目
    while(~scanf("%d",&n),n)
    {
        week++;
        for(i = 0; i<n; i++)
            scanf("%s %d",now[i].name,&now[i].num);
        sort(now,now+n,cmp);
        for(i = 0; i<n; i++)
            now[i].no = i+1;
        printf("----------------WEEK %d----------------\n",week);
        if(week==1)
        {
            for(i = 0; i<5; i++)
            {
                printf("%d.*NEW*   %s\n",now[i].no,now[i].name);
            }
        }
        else if(week)
        {
            for(i = 0; i<5; i++)
            {
                for(j = 0; j<m; j++)
                {
                    if(!strcmp(now[i].name,before[j].name))//比较排名
                    {
                        if(now[i].no>before[j].no)
                            printf("%d.*DOWN*  %s\n",now[i].no,now[i].name);
                        else if(now[i].no==before[j].no)
                            printf("%d.*STAY*  %s\n",now[i].no,now[i].name);
                        else if(now[i].no<before[j].no)
                            printf("%d.*UP*    %s\n",now[i].no,now[i].name);
                        break;
                    }
                }
                if(j>=m)
                    printf("%d.*NEW*   %s\n",now[i].no,now[i].name);
            }
        }
        for(i = 0; i<n; i++)
        {
            for(j = 0;j<m;j++)
            {
                if(!strcmp(before[j].name,now[i].name))//已经出现过,更新销量
                {
                    before[j].num = now[i].num;
                    break;
                }
            }
            if(j>=m || m==0)//m为0,或者以前的列表中没有出现过,则加入以前的列表中
            {
                strcpy(before[m].name,now[i].name);
                before[m].num = now[i].num;
                m++;
            }
        }
        for(j = 0;j<m;j++)
        {
            for(i = 0;i<5;i++)
            {
                if(!strcmp(before[j].name,now[i].name))//找出这次排名前五的
                {
                    before[j].no = now[i].no;
                    break;
                }
            }
            if(i>=5)//排名在五之后,令其排名为无穷大
            {
                before[j].no = 999999999;
            }
        }
    }

    return 0;
}

 

你可能感兴趣的:(模拟,CSU)