View Code of Problem 100

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct Songlist{
    char songname[100];
    int second;
    int score;
}songlist;

int main()
{
    double min,sec,flag;
    int songsum,listensum;
    songlist sl[105],tmp;int s;
    char listenname[100];
    double sum,ratio;
    while(scanf("%d",&songsum)!=EOF&&songsum!=0){
        s=0;
        for(int i=0;i<songsum;i++){  //输入初始歌单信息
            scanf("%s",sl[s++].songname);
            getchar();
            scanf("%lf:%lf",&min,&sec);
            sl[s-1].second=min*60+sec;
            sl[s-1].score=0;
        }
        scanf("%d",&listensum);
        for(int i=0;i<listensum;i++){//输入听歌时间
            scanf("%s",listenname);
            getchar();
            scanf("%lf:%lf",&min,&sec);
            for(int j=0;j<s;j++){
                if(strcmp(listenname,sl[j].songname)==0){//找到歌单中当前听的歌,计算当次得分
                    sum=min*60+sec;
                    sl[j].score+=5*sum/sl[j].second;
                    break;
                }
            }
        }
        for(int i=s-1;i>0;i--){
            flag=0;
            for(int j=0;j<i;j++){
                if(sl[j].score<sl[j+1].score){//分数排序从大到小
                    tmp=sl[j];
                    sl[j]=sl[j+1];
                    sl[j+1]=tmp;
                    flag=1;
                }else if(sl[j].score==sl[j+1].score){//遇到相同的分数
                    if(strcmp(sl[j].songname,sl[j+1].songname)>0){//按歌名字母排序
                        tmp=sl[j];
                        sl[j]=sl[j+1];
                        sl[j+1]=tmp;
                        flag=1;
                    }
                }
            }
            if(flag==0){
                break;
            }
        }
        for(int i=0;i<s;i++){
            printf("%s %d\n",sl[i].songname,sl[i].score);
        }
    }
	return 0;
}

Double click to view unformatted code.


Back to problem 100