B1141 PAT Ranking of Institutions (25分)
//记得12月份的时候一直卡
那时候交19分,卡一下午😶。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
using namespace std;
const int MAX=100005;
const int INF=0x3f3f3f3f;
int n;
struct node
{
string id;
int score;
int sumscore;
int number;
string name;
}num[MAX],pm[MAX];
map<string,int>book;
map<string,int>schtoA,schtoB,schtoT,sum;
set<string>st;
string change(string x)
{
for(int i=0;i<x.length();i++)
{
if(x[i]>='A'&&x[i]<='Z')
{
x[i]=x[i]-'A'+'a';
}
}
return x;
}
bool cmp(node a,node b)
{
if(a.sumscore!=b.sumscore)
return a.sumscore>b.sumscore;
else if(a.number!=b.number)
return a.number<b.number;
else
return a.name<b.name;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>num[i].id>>num[i].score>>num[i].name;
book[change(num[i].name)]++;
st.insert(change(num[i].name));
if(num[i].id[0]=='A')
{
schtoA[change(num[i].name)]+=num[i].score;
}
else if(num[i].id[0]=='B')
{
schtoB[change(num[i].name)]+=num[i].score;
}
else if(num[i].id[0]=='T')
{
schtoT[change(num[i].name)]+=num[i].score;
}
}
int t=0;
for(set<string>::iterator it=st.begin();it!=st.end();it++)
{
sum[*it]=schtoB[*it]/1.5+schtoA[*it]+schtoT[*it]*1.5;
pm[t].name=*it;
pm[t].sumscore=sum[*it];
pm[t].number=book[*it];
t++;
}
sort(pm,pm+t,cmp);
printf("%d\n",t);
for(int k=0;k<t;k++)
{
if(pm[k].sumscore==pm[k-1].sumscore)
{
cout<<k<<" "<<pm[k].name<<" "<<pm[k].sumscore<<" "<<pm[k].number<<endl;
}
else
cout<<k+1<<" "<<pm[k].name<<" "<<pm[k].sumscore<<" "<<pm[k].number<<endl;
}
return 0;
}
现在当水题打,一发过。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=100005;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;
struct student
{
string id;
double score;
string school;
}stu[MAX];
struct node
{
int Rank;
string id;
int score;
int number;
}sch[MAX];
map<string,double>mp;
map<string,int>num;
vector<string>vt;
bool cmp(node a,node b)
{
if(a.score!=b.score)
return a.score>b.score;
if(a.number!=b.number)
return a.number<b.number;
else
return a.id<b.id;
}
string change(string name)
{
for(int i=0;i<name.size();i++)
{
if(name[i]>='A'&&name[i]<='Z')
name[i]+=32;
}
return name;
}
int main()
{
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
cin>>stu[i].id>>stu[i].score>>stu[i].school;
}
for(int i=0;i<m;i++)
{
if(stu[i].id[0]=='B')
stu[i].score/=1.5;
else if(stu[i].id[0]=='T')
stu[i].score*=1.5;
mp[change(stu[i].school)]+=stu[i].score;
num[change(stu[i].school)]++;
if(num[change(stu[i].school)]==1)
vt.push_back(change(stu[i].school));
}
int k=vt.size();
for(int i=0;i<k;i++)
{
sch[i].id=vt[i];
sch[i].number=num[vt[i]];
sch[i].score=(int)mp[vt[i]];
}
sort(sch,sch+k,cmp);
printf("%d\n",k);
sch[0].Rank=1;
for(int i=0;i<k;i++)
{
if(sch[i+1].score==sch[i].score)
sch[i+1].Rank=sch[i].Rank;
else
sch[i+1].Rank=i+2;
printf("%d",sch[i].Rank);
cout<<" "<<sch[i].id;
printf(" %d %d\n",sch[i].score,sch[i].number);
}
return 0;
}