题目链接 PAT甲 1141
测试点4、5过不去
错误的代码:
#include<bits/stdc++.h>
#define N 100010
using namespace std;
//学生
struct student{
char id[7];
double score;
char school[7];
}stu[N];
//学校
struct s{
char school[7];
double TWS = 0;
int Ns = 0;
}t;
//算分
void adds(s& t,student& stu){
switch(stu.id[0]){
case 'B': t.TWS += stu.score/1.5;break;
case 'A': t.TWS += stu.score;break;
case 'T': t.TWS += stu.score*1.5;break;
}
}
//按学校字典序排名
bool cmp(const student& a,const student& b){
if(strcmp(a.school,b.school) <= 0)
return true;
return false;
}
//按总分排,总分相同按人数排
bool cmp1(const s& a,const s& b){
if(a.TWS > b.TWS||a.TWS == b.TWS&&a.Ns < b.Ns) return true;
return false;
}
int main(){
int n,m = 0;
vector<s> sch;
cin >> n;
//输入的同时,把所有学校改成小写
for(int i = 0;i < n;i++) {
cin >> stu[i].id >> stu[i].score >> stu[i].school;
for(int j = 0;stu[i].school[j];j++)
stu[i].school[j] = tolower(stu[i].school[j]);
}
//按学校字典序排名
sort(stu,stu + n,cmp);
//把不重复的学校塞到sch里,并计算总分和人数
for(int i = 0;i < n;i++){
strcpy(t.school,stu[i].school);
while(!strcmp(t.school,stu[i].school)){
adds(t,stu[i]);
t.Ns++;
i++;
}
sch.push_back(t);
m++;
t.TWS = 0;
t.Ns = 0;
i--;
}
//按总分排,总分相同按人数排
sort(sch.begin(),sch.begin() + m,cmp1);
cout << m << endl;
//相同分数排名相同,不相同就当前排名
int cur_r = 1,cur_TWS = sch[0].TWS;
for(int i = 0;i < m;i++){
if(cur_TWS != (int)sch[i].TWS) cur_r = i + 1,cur_TWS = sch[i].TWS;
cout << cur_r << ' ' << sch[i].school << ' ' << (int)sch[i].TWS << ' ' << sch[i].Ns << endl;
}
return 0;
}
把你的cmp1函数换成这个
测试点4是因为你没有看人数相同时比较学校名,,测试点5是你没有转化为int来比较排名
谢谢了,后来解决了也考完了就忘记啦