- 高 2029 届信息学竞赛选拔考试
奖学金
- @ 2026-9-4 20:29:55
using namespace std;
int n,m;
struct node{
string name;
int a,b,e,f,g;
char c,d;
}s[1001];
bool cmp(node x,node y){
if(x.g>y.g) return 1;
if(x.g<y.g) return 0;
else{
if(x.f<y.f) return 1;
else return 0;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i].name>>s[i].a>>s[i].b>>s[i].c>>s[i].d>>s[i].e;
s[i].f=i;
if(s[i].a>80&&s[i].e>=1) s[i].g+=8000;
if(s[i].a>85&&s[i].b>80) s[i].g+=4000;
if(s[i].a>90) s[i].g+=2000;
if(s[i].a>85&&s[i].d=='Y') s[i].g+=1000;
if(s[i].b>80&&s[i].c=='Y') s[i].g+=850;
}
sort(s+1,s+n+1,cmp);
cout<<s[1].name<<"\n"<<s[1].g<<"\n";
for(int i=1;i<=n;i++){
m+=s[i].g;
}
cout<<m;
return 0;
}
1 comments
-
Myobot @ 2026-9-4 20:30:03
我看到你提交的代码了。先别急着运行,我们一起来分析一下这道题的关键点。
题目核心考点:
- 结构体排序(多关键字排序)
- 条件判断的准确性
- 累加求和
先问几个问题,帮你自查:
- 你的结构体里字段
f是做什么用的?在cmp函数里你用它来比较,但题目要求的排序规则是什么?请再仔细读一遍题目——排序依据是奖学金总额,如果总额相同,应该按什么顺序输出?题目要求输出第一名,并列时怎么处理? - 看你的
cmp函数逻辑:当奖学金相等时,if(x.f<y.f) return 1; else return 0;——这里f是输入顺序。但题目真的要求按输入顺序排序吗?还是要求输出所有获得最高奖学金的人? - 重点检查条件:
- 院士奖学金:期末平均成绩 > 80 且 发表论文数 ≥ 1——你的代码里是
s[i].a>80&&s[i].e>=1,对吗? - 五四奖学金:期末平均成绩 > 85 且 班级评议成绩 > 80——你写的是
s[i].a>85&&s[i].b>80,注意是“>”还是“≥”? - 成绩优秀奖:期末平均成绩 > 90,你写的是
s[i].a>90,对吗? - 西部奖学金:期末 > 85 且 是西部学生(字符
'Y')——你的字段d代表什么?输入顺序对吗?
- 院士奖学金:期末平均成绩 > 80 且 发表论文数 ≥ 1——你的代码里是
提示:这道题的数据范围很小(),不需要排序也能做——你可以直接遍历找最大值,并处理并列情况。
先回答我上面几个问题,特别是排序规则和输出要求,然后我们再继续。你卡在哪里了?
- 1