题目描述
根据学校参加运动会项目的积分情况,计算每个学校所获得的总积分,按照积分高低输出学校以及学校积分。
输入
输入包括多行数据,每行数据依次是学校名称 项目名称 选手姓名 成绩 积分
学校总数不超过10个,学校名称、项目名称和选手姓名是字符串形式,不超过50个字符,成绩为浮点型数据,积分为整数,大于等于0,小于等于10
输出
按照学校获得积分降序排列,每个学校一行,输出学校名称 积分
样例输入 复制
北化 跳高 张三 1.7 7
北大 跳高 李四 1.55 3
样例输出 复制
北化 7
北大 3
俺滴农村方法就是用结构体,然后再排序,
#include<bits/stdc++.h>
using namespace std;
struct compete{
string school;
float credit;
bool godie;
}a[1000];
int sort1(compete a,compete b)
{
return a.school<b.school;
}
int sort2(compete a,compete b)
{
return a.credit>b.credit;
}
int main()
{
string school;
string sport;
string name;
float score;
float credit;
int temp=0;
while(cin>>school>>sport>>name>>score>>credit)
{
a[temp].school=school;
a[temp].credit=credit;
temp++;
}
sort(a,a+temp,sort1);
for(int i=0;i<temp;i++)
{
if(a[i].school==a[i+1].school)
{
a[i+1].credit+=a[i].credit;
a[i].godie=true;
}
}
sort(a,a+temp,sort2);
for(int i=0;i<temp;i++)
if(!a[i].godie)
cout<<a[i].school<<" "<<a[i].credit<<endl;
}
再看看老湿的城里人用的方法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int>mp;
string school,project,name;
double grade;
int score;
while(cin>>school>>project>>name>>grade>>score)
{
if(mp.find(school)==mp.end())
mp[school]=0;
mp[school]+=score;
}
while(mp.size()>0)
{
map<string,int>::iterator itMax=mp.begin();
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
{
if(it->second>itMax->second)
{
itMax=it;
}
}
cout<<itMax->first<<" "<<itMax->second<<endl;
mp.erase(itMax);
}
return 0;
}
我的方法虽土,但是好理解呀!