PAT(Basic Level) Practice : 1085 PAT单位排行 (25分)
1085 PAT单位排行 (25分)
参考> https://www.cnblogs.com/Dup4/p/9433200.html
测试点5的坑
必须取完整数之后再排序,比如
两个单位192.1<192.2
在取整之前他们的排名是不同的,但是取完整数之后排名就相同了。
代码
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;
#include<iomanip>
//精度
#include<cmath>
//round四舍五入取整
#include <map>
class school
{
public:
string name;
double grade1;
double grade2;
double grade3;
double sum;
int num;
int sum1;
school()
{
name="";
grade1=0;//B
grade2=0;//A
grade3=0;//T
sum=0;
sum1=0;
num=0;
}
};
bool compare(school sc1,school sc2)
{
if(sc1.sum1!=sc2.sum1)
return sc1.sum1>sc2.sum1;
else if(sc1.num!=sc2.num)
return sc1.num<sc2.num;
else
return sc1.name.compare(sc2.name)<0;
}
int main()
{
int n;
cin>>n;
vector<school> schools;
map<string,int> nameIndex;
for(int i=0;i<n;i++)
{
string str;
int grade;
string name;
cin>>str>>grade>>name;
for(int i=0;i<name.length();i++)
{
if(name[i]>='A'&&name[i]<='Z')
name[i]=name[i]-'A'+'a';
}
if(nameIndex[name]==0)
{
school temp;
temp.name=name;
temp.num++;
if(str[0]=='B')
temp.grade1+=grade;
else if(str[0]=='A')
temp.grade2+=grade;
else
temp.grade3+=grade;
schools.push_back(temp);
//索引要加1
nameIndex[name]=schools.size();
}else
{
schools[nameIndex[name]-1].num++;
if(str[0]=='B')
schools[nameIndex[name]-1].grade1+=grade;
else if(str[0]=='A')
schools[nameIndex[name]-1].grade2+=grade;
else
schools[nameIndex[name]-1].grade3+=grade;
}
}
for(int i=0;i<schools.size();i++)
{
schools[i].sum=schools[i].grade1/1.5+schools[i].grade2+schools[i].grade3*1.5;
schools[i].sum1=schools[i].sum;
}
sort(schools.begin(),schools.end(),compare);
cout<<schools.size()<<endl;
int ranking;
for(int i=0;i<schools.size();i++)
{
int res=schools[i].sum;
if(i==0)
{
cout<<1;
ranking=1;
}
else
{
if((int)schools[i].sum==(int)schools[i-1].sum)
{
cout<<ranking;
//cout<<"Kkk"<<endl;
}
else
{
cout<<i+1;
ranking=i+1;
}
}
cout<<" "<<schools[i].name<<" "<<res<<" "<<schools[i].num<<endl;
}
return 0;
}