WA了好多次。但其实只要思路正确,不应该WA这么多次的。
大部分都是细节上WA。,纯暴力。
代码虐我千百遍,我待代码如初恋
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
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <limits.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <queue>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <stack>
#include <deque>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define MAXN 150
struct node{
char name[50];
int rank;
int sum;
int vis;
int f;
}a[MAXN];;
struct node1{
char name1[50];
int rank1;
int sum1;
int prank;
int f1;
}b[MAXN];
bool cmp(node a,node b){
return a.sum > b.sum;
}
bool cmp1(node1 a,node1 b){
return a.sum1 > b.sum1;
}
int main(){
int i;
for(i=0;i<MAXN;i++){
a[i].sum = 0;
a[i].rank = 99999;
b[i].sum1 = 0;
a[i].vis = 0;
a[i].f = 0;
b[i].f1 = 0;
}
int n;
int count = 1;
int fcount = 0;
char fname[50];
int fsum;
int j = 0;
int flag;
int k;
while(~scanf("%d",&n)){
if(n == 0){
break;
}
if(count == 1){
for(i=0;i<n;i++){
scanf("%s",a[i].name);
scanf("%d",&a[i].sum);
fcount++;
}
sort(a,a+n,cmp);
printf("----------------WEEK 1----------------\n");
for(i=0;i<5;i++){
printf("%d.",i+1);
printf("*NEW* ");
printf("%s\n",a[i].name);
a[i].rank = i+1;
}
for(i=5;i<n;i++){
a[i].rank = 999999;
}
count++;
}
else{
k = 0;
for(i=0;i<n;i++){
flag = 0;
scanf("%s",fname);
for(j=0;j<fcount;j++){
if(strcmp(fname,a[j].name)==0){
a[j].vis = 1;
scanf("%d",&fsum);
a[j].sum = fsum;
flag = 1;
break;
}
}
if(flag == 0){
a[fcount].vis = 1;
strcpy(a[fcount].name,fname);
scanf("%d",&a[fcount].sum);
a[fcount].f = 1;
fcount++;
}
}
//sort(b,b+k,cmp1);
for(i=0;i<fcount;i++){
if(a[i].vis == 1){
b[k].sum1 = a[i].sum;
b[k].f1 = a[i].f;
strcpy(b[k].name1,a[i].name);
b[k].prank = a[i].rank;
k++;
}
}
sort(b,b+k,cmp1);
printf("----------------WEEK %d----------------\n",count);
for(i=0;i<5;i++){
//printf("----------------WEEK %d----------------\n",count);
if(b[i].f1 == 1){
printf("%d.",i+1);
printf("*NEW* ");
printf("%s\n",b[i].name1);
}
else{
if(i+1 == b[i].prank){
printf("%d.",i+1);
printf("*STAY* ");
printf("%s\n",b[i].name1);
}
else if(i+1 < b[i].prank){
printf("%d.",i+1);
printf("*UP* ");
printf("%s\n",b[i].name1);
}
else if(i+1 > b[i].prank){
printf("%d.",i+1);
printf("*DOWN* ");
printf("%s\n",b[i].name1);
}
}
}
for(i=0;i<5;i++){
b[i].rank1 = i+1;
}
for(i=5;i<k;i++){
b[i].rank1 = 99999;
}
for(i=0;i<fcount;i++){
a[i].rank = 999999;
}
for(i=0;i<5;i++){
for(j=0;j<fcount;j++){
if(strcmp(b[i].name1,a[j].name)==0){
a[j].rank = b[i].rank1;
}
}
}
for(i=0;i<fcount;i++){
a[i].vis = 0;
a[i].f = 0;
}
count++;
}
}
return 0;
}