一道因为自己弱智而差点就地身亡的题。
第一次提交,最后一个测试点没通过,我以为自己是特殊情况没考虑到,然后反复思考了近半个小时无果,本来下定决定坚决不百度的,最后我放弃了。
然后看了别人的代码,发现最后一个测试点会超时,各种原因,我又提交了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;
}