一道因为自己弱智而差点就地身亡的题。
第一次提交,最后一个测试点没通过,我以为自己是特殊情况没考虑到,然后反复思考了近半个小时无果,本来下定决定坚决不百度的,最后我放弃了。
然后看了别人的代码,发现最后一个测试点会超时,各种原因,我又提交了N次,还是不通过。最后终于TMD破案了。我知道中间结果是浮点数,但是我以为整型会自动转换成浮点型。我真是个弱智,蠢逼!
以上全是我个人情绪,说出来引以为戒。
注意:
int a = 5;
a=a/1.5;
printf("%d\n",a);
a输出的结果是3,并不会自动变为浮点数。我就错在这里,想当然了。
题解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
struct node{
string school;
int number;
float score;
}R[100005];
bool cmp(node a, node b){
int x=int(a.score);
int y=int(b.score);
if(x!=y) return x > y;
else if(a.number!=b.number) return a.number < b.number;
else return a.school < b.school;
}
int main(){
int n;
string str,school;
float score;
map<string,int> mp;
mp.clear();
scanf("%d",&n);
char st[12],ch[12];
int cnt=0,t;
for(int i=0;i<n;i++){
scanf("%s %f %s",st,&score,ch);
str=st;
school=ch;
transform(school.begin(),school.end(),school.begin(),::tolower); //名字变小写
if(str[0]=='B') score=score/1.5;
else if(str[0]=='T') score=score*1.5;
if(mp.find(school)!=mp.end()){
t = mp[school];
R[t].score+=score;
R[t].number++;
}else{
mp[school]=cnt;
t=cnt;
R[t].school=school;
R[t].score=score;
R[t].number=1;
cnt++;
}
}
sort(R,R+cnt,cmp);
printf("%d\n",cnt);
int k=1;
for(int i=0;i<cnt;i++){
if(i==0)
printf("%d %s %d %d\n",k,R[i].school.c_str(),int(R[i].score),R[i].number);
else if(int(R[i-1].score)==int(R[i].score)){
printf("%d %s %d %d\n",k,R[i].school.c_str(),int(R[i].score),R[i].number);
}else{
printf("%d %s %d %d\n",i+1,R[i].school.c_str(),int(R[i].score),R[i].number);
k=i+1;
}
}
return 0;
}