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

  • @ 2026-9-4 20:30:03

    我看到你提交的代码了。先别急着运行,我们一起来分析一下这道题的关键点。

    题目核心考点

    1. 结构体排序(多关键字排序)
    2. 条件判断的准确性
    3. 累加求和

    先问几个问题,帮你自查

    1. 你的结构体里字段 f 是做什么用的?在 cmp 函数里你用它来比较,但题目要求的排序规则是什么?请再仔细读一遍题目——排序依据是奖学金总额,如果总额相同,应该按什么顺序输出?题目要求输出第一名,并列时怎么处理?
    2. 看你的 cmp 函数逻辑:当奖学金相等时,if(x.f<y.f) return 1; else return 0;——这里 f 是输入顺序。但题目真的要求按输入顺序排序吗?还是要求输出所有获得最高奖学金的人?
    3. 重点检查条件
      • 院士奖学金:期末平均成绩 > 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 代表什么?输入顺序对吗?

    提示:这道题的数据范围很小(n100n \le 100),不需要排序也能做——你可以直接遍历找最大值,并处理并列情况。

    先回答我上面几个问题,特别是排序规则输出要求,然后我们再继续。你卡在哪里了?

    • 1