这是个排序题,做题过程中对sort的理解加深了不少,记下来避免忘记。

题目来源:https://www.luogu.org/problemnew/show/P1068

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,AA市对

所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根

据计划录取人数的150\%150%划定,即如果计划录取mm名志愿者,则面试分数线为排名第m \times 150\%m×150%

(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有

选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成

绩。

输入输出格式

输入格式:

第一行,两个整数 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n)n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其

中nn表示报名参加笔试的选手总数,mm表示计划录取的志愿者人数。输入数据保证 m \times 150\%m×150%

向下取整后小于等于 nn。

第二行到第 n+1n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000 ≤ k ≤ 9999)k(1000≤k≤9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)s(1≤s≤100)。数据保证选手的报名号各不相同。

输出格式:

第一行,有22个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含22个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

输入示例:

6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88

输出:

88 5
1005 95
2390 95
1000 90
1001 88
3239 88

分析:结构体定义,分数排序,确定分数线,确定实际大于等于分数线的人数,考号排序,输出。

后来发现可以直接将分数排序和考号排序合成一体,减少了好几行代码。

初次代码思路:

 #include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
struct Can {
int num;
int score;
}can[];
bool compare1(Can a, Can b)
{
return a.score > b.score;
}
bool compare2(Can a, Can b)
{
return a.num < b.num;
}
int n, m;
int mline, mscore;
int head = , tail = , mid;
int main()
{
cin >> n >> m;
for (int i = ; i < n; i++) cin >> can[i].num >> can[i].score;
sort(can, can + n, compare1);
mline = floor(1.5*m);
mscore = can[mline - ].score;
for (int i = floor(1.5*m); i < n; i++)
if (can[i].score == mscore)
mline++;
mid = can[].score;
for (int i = ; i <= mline; i++)
{
if (can[i].score != mid)
{
sort(can + head, can + tail + head, compare2);
head = head + tail;
tail = ;
mid = can[head].score;
}
else tail++;
}
cout << mscore << " " << mline << endl;
for (int i = ; i < mline; i++)
cout << can[i].num << " " << can[i].score << endl;
return ;
}

备忘录1:结构体排序

 bool compare(example x, example y)
{  
return x.a<y.a;
//<升序,>降序
} struct example
{
int a,b;
}ex[n]; sort(ex, ex+n, compare);

即可对ex[n]中的a部分进行升序排序,其他部分(b)随动。

若要将分数排序和考号排序合成一体,可用如下代码:

 struct Can {
int num;
int score;
}can[];
int cmp(Can a, Can b){
if(a.score>b.score){
//比成绩
return true;
}
else if(a.score==b.score){
if(a.num<b.num)return true;
//比较考号
else return false;
}
else return false;
}

减少了31-40行的10行代码,还减少了出错的可能性。

备忘录2:部分排序

一般用到排序时我们是这样用的:

int p[n]; sort(p,p+n,compare);

从p数组的开头开始,进行长度为n的排序。

那么,不从p的开头开始而是从其中间开始的排序应该怎么写呢?

sort(p+a,p+b,compare);

其中a为开始排序的下标,b-1为结束排序的下标。

例:

 int p[]={,,,,,,};
sort(p+,,p+);//结果{9,3,4,5,6,7,8}
sort(p+,p+);//结果{9,4,5,6,7,8,3}
sort(p+,p+);//结果{9,8,6,7,5,4,3}

也就是说b-a就是排序的长度。

c++之洛谷P1068分数线划定的更多相关文章

  1. 洛谷——P1068 分数线划定

    P1068 分数线划定 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据 ...

  2. 洛谷 P1068 分数线划定

    P1068 分数线划定 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据 ...

  3. 洛谷P1068 分数线划定:sort结构体排序+贪心

    题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试. 面试分数线根据计划录取人数的150%划定, ...

  4. 洛谷 P1068 分数线划定【结构体排序】

    题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据计划录取人数的150%划 ...

  5. 洛谷 P1068 分数线划定【排序+模拟】

    世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,AA市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据计划录取人数的150\%150%划 ...

  6. 洛谷P1068 分数线划定

    https://www.luogu.org/problem/P1068 #include<bits/stdc++.h> using namespace std; struct Can { ...

  7. luogu P1068 分数线划定 x

    P1068 分数线划定 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据 ...

  8. (sort)P1068 分数线划定 洛谷

    题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,AA市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据计划录取人数的150\% ...

  9. 洛谷 P1059明明的随机数 & P1068分数线划定 & P1781宇宙总统

    题目:https://www.luogu.org/problemnew/show/P1059 思路:STL中的set使用. //#include<bits/stdc++.h> #inclu ...

随机推荐

  1. 点击一个div ,把div里的某个参数的值,传到一个input里面

    ​​​

  2. 高斯消去、追赶法 matlab

    1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...

  3. 添加外键式异常 1215-cannot add foreign key constranint

    添加外键时报错,原因是添加外键的表的字段的字段类型不一致 比如我的第一张表id是int类型,添加约束的dep_id是bigint类型,所以报错,只要把两张表添加约束的字段类型改成统一的即可 本人大学生 ...

  4. JavaScript无阻塞加载具体方式

    将脚本放在底部.\还是放在head中,用以保证在js加载前,能加载出正常显示的页面.\<script>标签放在\前 成组脚本:由于每个\<script>标签下载时阻塞页面解析过 ...

  5. 6、JUC--同步锁Lock

    显示锁 Lock  在Java 5.0之前,协调共享对象的访问时可以使用的机 制只有 synchronized 和 volatile .Java 5.0 后增加了一些 新的机制,但并不是一种替代内置 ...

  6. MetaMask/metamask-extension-provider

    用来探测你的浏览器中有没有安装metamask插件 https://github.com/MetaMask/metamask-extension-provider MetaMask Extension ...

  7. HTTPS_SSL apache认证、配置的、步骤以及原理说明

    一 .1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址,想要用系统的人没有证书就访问不了系统HTTP ...

  8. RedHat Enterprise Linux 6.4使用Centos 6的yum源问题

    RedHat Enterprise Linux 6.4使用Centos 6的yum源问题 作为一名新手,学习Linux已经一个月了,其间遇到了不少问题,而今天笔者遇到的问题是 #yum install ...

  9. Javascript异步编程之setTimeout与setInterval详解分析(一)

    Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...

  10. PAT B1034 有理数四则运算 (20 分)

    本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前 ...