View Code of Problem 100

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct music{
	char name[100];
	int time;
	int sc; 
};
bool cmp(music a,music b)
{
	if(a.sc!=b.sc)//a,b的分数不同,大的在前 
		return a.sc>b.sc;
	else return strcmp(a.name,b.name)<0;//分数相同看字典大小 
}
int main()
{
	int n,m;
	music m1[105];
	music m2;//m1为歌曲信息,m2为我的听歌记录 
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		for(int i=0;i<n;i++)
		{
			int min,s;	//分数,秒 
			scanf("%s",m1[i].name);
			scanf("%d:%d",&min,&s);
			m1[i].time=min*60+s;
			m1[i].sc=0;	//初始化分数 
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			int min,s;
			scanf("%s",m2.name);
			scanf("%d:%d",&min,&s);
			m2.time=min*60+s;//听歌的总秒数 
			for(int j=0;j<n;j++){ 
				if(strcmp(m2.name,m1[j].name)==0)//找到对应的歌曲,加分
						m1[j].sc+=(5*m2.time/m1[j].time);
			} 
		}	
		//sort(m1,m1+n,cmp);
		for(int i=0;i<n;i++)//别人答案的方法,我自己用的是sort函数,运行时异常通不过 
		{
			int pos = 0;
			for(int j = 1; j < n; j++)
			{
				if(m1[j].sc > m1[pos].sc)
					pos = j;
				else if(m1[j].sc == m1[pos].sc)
					if(strcmp(m1[j].name, m1[pos].name) < 0)
						pos = j;
			}
			printf("%s %d\n", m1[pos].name, m1[pos].sc);
			m1[pos].sc = -1;
		 } 
	//	for(int i=0;i<n;i++)
		//	printf("%s %d\n",m1[i].name,m1[i].sc);
	}
    return 0;
}

Double click to view unformatted code.


Back to problem 100