【题目链接】

ybt 1180:分数线划定
ybt 1946:【09NOIP普及组】分数线划定
OpenJudge NOI 1.10 05:分数线划定
洛谷 P1068 [NOIP2009 普及组] 分数线划定

【题目考点】

1. 排序

【君义精讲】排序算法

【解题思路】

该题要排序的元素个数最大为5000,选用O(n2)O(n^2)O(n2)的排序算法即可。
基本思路为:先按照“先按成绩降序排序,成绩相同按报名号升序排序”这样的排序规则对输入的数据进行排序,取第⌊m∗1.5⌋\lfloor m*1.5 \rfloor⌊m∗1.5⌋个人的分数线,再看分数大于等于分数线的人数有多少,再把这些人的信息输出。
可选的写法有:

  1. 设结构体而后定义结构体变量的排序规则。
  2. 直接写出排序规则
  3. 用稳定的排序算法,先按报名号排序,再按成绩排序

【题解代码】

解法1:设结构体,使用sort函数排序

#include <bits/stdc++.h>
using namespace std;
#define N 5005
struct Stu
{int k, s;//k:报名号 s:成绩
};
bool cmp(Stu &a, Stu &b)
{if(a.s == b.s)//如果分数相同 return a.k < b.k;//报名号小的在前面 else//如果分数不同 return a.s > b.s;//成绩高的在前面
}
int main()
{Stu stu[N];int n, m, line, ct = 0;//line:分数线 ct:人数 cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> stu[i].k >> stu[i].s;sort(stu+1, stu+1+n, cmp);//根据cmp指定的规则进行排序 line = stu[int(m*1.5)].s;//确定分数线for(int i = 1; i <= n; ++i){if(stu[i].s >= line)ct++;}cout << line << ' ' << ct << endl;for(int i = 1; i <= ct; ++i)//输出前ct个人的信息 cout << stu[i].k << ' ' << stu[i].s << endl;return 0;
}

解法2:不用结构体 冒泡排序 直接写出排序规则

#include <bits/stdc++.h>
using namespace std;
#define N 5005
int main()
{ int k[N], s[N], n, m, line, ct = 0;//line:分数线 ct:人数 cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> k[i] >> s[i];for(int i = 1; i <= n - 1; ++i)for(int j = 1; j <= n - i; ++j){if(s[j] < s[j+1] || s[j] == s[j+1] && k[j] > k[j+1])//如果右面的分数高,或分数相同时右面的编号小,要交换{swap(s[j], s[j+1]);swap(k[j], k[j+1]);} }line = s[int(m*1.5)];//确定分数线for(int i = 1; i <= n; ++i){if(s[i] >= line)ct++;}cout << line << ' ' << ct << endl;for(int i = 1; i <= ct; ++i)//输出前ct个人的信息 cout << k[i] << ' ' << s[i] << endl;return 0;
}

解法3:计数排序+插入排序 使用二维数组记录要输出的数字,而后输出

#include <bits/stdc++.h>
using namespace std;
int score[105][5005] = {};//score[i]:分数为i的各个人的编号 score[i][0]为score[i]这个一维数组的长度
int main()
{ int k, s, n, m, line, ct = 0;//line:分数线 ct:人数 cin >> n >> m;for(int i = 1; i <= n; ++i){cin >> k >> s;score[s][++score[s][0]] = k;//把k插入score[s]数组,做插入排序,依编号从小到大排序for(int j = score[s][0]; j > 1; --j){ if(score[s][j] < score[s][j-1])swap(score[s][j], score[s][j-1]);elsebreak;}}int lnum = int(m*1.5);//lnum:第几个人的分数为分数线 for(int i = 100; i >= 0; --i){ct += score[i][0];//分数为i的人有score[i][0]个人if(ct >= lnum){line = i;break; }}cout << line << ' ' << ct << endl;for(int i = 100; i >= line; --i)//输出分数到line的人的信息for(int j = 1; j <= score[i][0]; ++j)cout << score[i][j] << ' ' << i << endl;return 0;
}

解法4:用stable_sort稳定的排序进行两趟排序

选用任意一种稳定的排序都可以

#include <bits/stdc++.h>
using namespace std;
#define N 5005
struct Stu
{int k, s;//k:报名号 s:成绩
};
bool cmp_k(const Stu &a, const Stu &b)//编号比较规则
{return a.k < b.k;
}
bool cmp_s(const Stu &a, const Stu &b)//分数比较规则
{return a.s > b.s;
}
int main()
{Stu stu[N];int n, m, line, ct = 0;//line:分数线 ct:人数 cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> stu[i].k >> stu[i].s;stable_sort(stu+1, stu+1+n, cmp_k);//先根据编号比较,再根据分数比较stable_sort(stu+1, stu+1+n, cmp_s);//先根据编号比较,再根据分数比较line = stu[int(m*1.5)].s;//确定分数线for(int i = 1; i <= n; ++i){if(stu[i].s >= line)ct++;}cout << line << ' ' << ct << endl;for(int i = 1; i <= ct; ++i)//输出前ct个人的信息 cout << stu[i].k << ' ' << stu[i].s << endl;return 0;
}

信息学奥赛一本通 1180 | 1946:【09NOIP普及组】分数线划定 | OpenJudge NOI 1.10 05 | 洛谷 P1068 [NOIP2009 普及组] 分数线划定相关推荐

  1. 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金

    [题目链接] ybt 1179:奖学金 ybt 1938:[07NOIP普及组]奖学金 OpenJudge NOI 1.10 04:奖学金 洛谷 P1093 [NOIP2007 普及组] 奖学金 [题 ...

  2. 信息学奥赛一本通 1184 | 1934:【06NOIP普及组】明明的随机数 | OpenJudge NOI 1.10 09 | 洛谷 P1059 [NOIP2006 普及组] 明明的随机数

    [题目链接] ybt 1184:明明的随机数 ybt 1934:[06NOIP普及组]明明的随机数 OpenJudge NOI 1.10 09:明明的随机数 洛谷 P1059 [NOIP2006 普及 ...

  3. 信息学奥赛一本通 1958:【12NOIP普及组】寻宝 | OpenJudge NOI 1.12 06 | 洛谷 P1076 [NOIP2012 普及组] 寻宝

    [题目链接] ybt 1958:[12NOIP普及组]寻宝 洛谷 P1076 [NOIP2012 普及组] 寻宝 OpenJudge NOI 1.12 06:寻宝 [题目考点] 1. 模拟 2. 循环 ...

  4. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币

    [题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...

  5. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

  6. 信息学奥赛一本通 1112:最大值和最小值的差 | OpenJudge NOI 1.9 05

    [题目链接] ybt 1112:最大值和最小值的差 OpenJudge NOI 1.9 05:最大值和最小值的差 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变 ...

  7. 信息学奥赛一本通 1010:计算分数的浮点数值 | OpenJudge NOI 1.3 05

    [题目链接] ybt 1010:计算分数的浮点数值 OpenJudge NOI 1.3 05:计算分数的浮点数值 [题目考点] 1. 一般除法运算 / 被除数 ÷ 除数 = 小数商 例:5 / 2 = ...

  8. 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和

    [题目链接] ybt 1173:阶乘和 注:一本通上这题,应该把n≤50n\le50n≤50当做n≤100n\le100n≤100来看 OpenJudge NOI 1.6 15:阶乘和 洛谷 P100 ...

  9. 信息学奥赛一本通 1233:接水问题 | 1950:【10NOIP普及组】接水问题 | OpenJudge NOI 1.9 15 | 洛谷 P1190 [NOIP2010 普及组] 接水问题

    [题目链接] ybt 1233:接水问题 ybt 1950:[10NOIP普及组]接水问题 OpenJudge NOI 1.9 15:接水问题 洛谷 P1190 [NOIP2010 普及组] 接水问题 ...

最新文章

  1. 冬眠动物克服肌肉萎缩,靠的居然是“肠子”|Science
  2. stata 导出 相关系数表_Stata: 空间权重矩阵的构建
  3. virtualbox配置apache_VirtualBox虚拟机网络设置(四种方式)
  4. PHP物业居民小区业主房产办公管理系统源码-支持多小区管理系统
  5. html的语义化面试题,html面试题
  6. geforce experience_Nvidia? Geforce? Experience?是什么?如何使用呢?
  7. faster rcnn论文_【论文解读】精读Faster RCNN
  8. 第六届蓝桥杯:三羊献瑞
  9. springboot 打 jar 包分离依赖 lib 和 配置文件
  10. VS配置OpenCV教程(超详细)
  11. openresty性能调优
  12. visio流程图添加连接点
  13. 中国最卷的公务员考试,挤满清北毕业生
  14. html个人单页代码,个人单页HTML模板
  15. QT上位机学习(一)
  16. VMware vCenter/vSphere/vSan/Esxi/7.0 lic许可
  17. 米的换算单位和公式_数学单位换算公式,1-6年级计算必备!
  18. 【时间与空间】极移矩阵
  19. 使用navicat导入SQL语句的教程
  20. 阿里云短信服务isv.INVALID_PARAMETERS返回,短信发送失败

热门文章

  1. 我对NHibernate的感受(3):有些尴尬的集合支持
  2. [转]粤语发音字典-粤语翻译
  3. Android共享电脑上网
  4. RMAN backup recovery area 命令
  5. 书店看不要钱的JS笔记
  6. 求周期字符串的最小子串
  7. 8000种子用户创造指数级裂变,谁说当年校内网发家是靠鸡腿?
  8. 求职和跳槽最好的月份要来了吗
  9. 阿里二面差点败在这道题:MySQL自增主键为何不是连续的呢?
  10. 语法糖甜不甜?巧用枚举实现“状态”转换限制