首页 > 其他分享 >【题解】【结构体排序】——[NOIP2007 普及组] 奖学金

【题解】【结构体排序】——[NOIP2007 普及组] 奖学金

时间:2024-09-07 18:53:30浏览次数:6  
标签:语文 NOIP2007 chinese 题解 score 89 总分 排序 奖学金

【题解】【结构体排序】——[NOIP2007 普及组] 奖学金

[NOIP2007 普及组] 奖学金

通往洛谷的传送门

题目背景

NOIP2007 普及组 T1

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 3 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。

注意,在前 5 5 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279  
5 279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 7 7 号、 5 5 5 号。这两名同学的总分都是 279 279 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 7 7 7 的学生语文成绩更高一些。

如果你的前两名的输出数据是:

5 279  
7 279

则按输出错误处理,不能得分。

输入格式

共 n + 1 n+1 n+1 行。

第 1 1 1 行为一个正整数 n ≤ 300 n \le 300 n≤300,表示该校参加评选的学生人数。

第 2 2 2 到 n + 1 n+1 n+1 行,每行有 3 3 3 个用空格隔开的数字,每个数字都在 0 0 0 到 100 100 100 之间。第 j j j 行的 3 3 3 个数字依次表示学号为 j − 1 j-1 j−1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1 ∼ n 1\sim n 1∼n(恰好是输入数据的行号减 1 1 1)。

保证所给的数据都是正确的,不必检验。

输出格式

共 5 5 5 行,每行是两个用空格隔开的正整数,依次表示前 5 5 5 名学生的学号和总分。

输入输出样例

输入 #1

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出 #1

6 265
4 264
3 258
2 244
1 237

输入 #2

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出 #2

8 265
2 264
6 264
1 258
5 258

1.题意解析

    一道经典的结构体排序题。

    定义一个结构体student,储存每名学生的信息,如下:

struct student//储存每个同学的信息 
{
	int num,score,chinese;//序号,总分和语文分数
}a[310];

    然后是排序规则,根据题意模拟就行了,如下:

bool cmp(student a,student b)
{
	if(a.score==b.score)//总分相同比语文 
	    if(a.chinese==b.chinese)//语文相同比输入顺序 
	        return a.num<b.num;
	    else return a.chinese>b.chinese;
	else return a.score>b.score;
}

2.AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
struct student//储存每个同学的信息 
{
	int num,score,chinese;
}a[310];
bool cmp(student a,student b)
{
	if(a.score==b.score)//总分相同比语文 
	    if(a.chinese==b.chinese)//语文相同比输入顺序 
	        return a.num<b.num;
	    else return a.chinese>b.chinese;
	else return a.score>b.score;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
	    int math,english;
		cin>>a[i].chinese>>math>>english;
		a[i].score=a[i].chinese+math+english;
		a[i].num=i;
	}
	sort(a+1,a+n+1,cmp);//排序 
	for(int i=1;i<=5;i++)
	    cout<<a[i].num<<" "<<a[i].score<<endl;
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

标签:语文,NOIP2007,chinese,题解,score,89,总分,排序,奖学金
From: https://blog.csdn.net/Pantheraonca/article/details/141967759

相关文章

  • [ABC328G] Cut and Reorder 题解
    [ABC328G]CutandReorder题解题目不难,思维难度尚可。首先需要发现的性质是\(1\)操作的次数最多只需要使用一次,使用多少次其实都是等价的。\(n\le22\)显然考虑状压dp。平凡的想法是设\(dp_{i,j}\)表示填数的状态为\(i\),最后一个填的是\(j\)位置的数的最小代价。这......
  • CF1991F Triangle Formation 题解
    Description你有\(n\)根棍子,从\(1\)到\(n\)编号。第\(i\)根棍子的长度是\(a_i\)。你需要回答\(q\)个问题。在每个查询中,你会得到两个整数\(l\)和\(r\)(\(1\lel<r\len,r−l+1\ge6\))。确定是否可以从编号为\(l\)到\(r\)的棒中选择\(6\)个不同的棒,形......
  • [ABC293Ex] Optimal Path Decomposition 题解
    [ABC293Ex]OptimalPathDecomposition题解是一道难得一遇的好题。对于题目中的两个限制,同时满足是困难的,于是考虑常见的套路:先固定其中一个,再计算另一个。对于本题,显然\(k\)是有单调性的,于是考虑二分这个\(k\),将最优性问题转化为可行性问题,dp路径的最小长度。那么考虑d......
  • CF1991E Coloring Game 题解
    Description有一个由\(n\)个顶点和\(m\)条边组成的无向图。每个顶点可以用三种颜色之一着色:\(1\)、\(2\)或\(3\)。初始时,所有顶点都未着色。Alice和Bob正在玩一个包含\(n\)轮的游戏。在每一轮中,都会发生以下两个步骤:Alice选择两种不同的颜色。Bob选择一个未......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • RecyclerView 高效使用与常见问题解决
    RecyclerView是Android应用开发中最常用的UI组件之一,通常用于显示大量数据列表。尽管功能强大,但如果使用不当,会导致性能问题、数据错乱或滚动卡顿等问题。在本篇文章中,我们将探讨RecyclerView的一些常见坑点,提供解决方案,并附带代码示例。1.坑点:ViewHolder重用导致数据错乱......
  • ctfshow web红包题第二弹题解
    从今天开始记录刷题日常打开靶场平平无奇,看源代码发现如下提示get方式提交cmd参数,猜测是命令执行漏洞,先写个phpinfo();试试。有用,但报错cerror查看显示出来部分php代码,过滤了很多东西if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)) 第一个正则表达式把字母数字几乎全......
  • [ABC137F] Polynomial Construction 题解
    明明有最厉害最好想的插值做法,怎么没有人写呢。思路考虑\(n\)个点可以确定一个\(n-1\)次多项式。如何确定。令\(l_i(x)=\prod_{j\not=i}\frac{(x-x_j)}{(x_i-x_j)}\)。可以发现这个多项式在\(x=x_i\)时值为一,在\(x=x_j(j\not=i)\)时值为零。那么就有:\[F(x)=\su......
  • 洛谷 P3034 Cow Photography G/S——题解
    洛谷P3034题解传送锚点摸鱼环节[USACO11DEC]CowPhotographyG/S题面翻译题目描述今天的奶牛们特别调皮!FarmerJohn想做的只是给排成一排的奶牛拍照,但是在他拍下照片之前,奶牛们一直在移动。具体地说,FJ有\(N\)头奶牛(\(1\leqN\leq20\,000\)),每头奶牛都有一个唯一确......
  • 题解:AT_abc369_e [ABC369E] Sightseeing Tour 详细版
    题目大意给定一个NNN个点,MMM条边的无向图。其中边有边权。有......