60分求助

P1068 [NOIP2009 普及组] 分数线划定

@[xiongpapa](/user/1005879) ```cpp #include <bits/stdc++.h> using namespace std; int n, m; struct node { int k; int s; } a[5001], b[5001]; void buble(int cnt, node b[]) { for (int i = 1; i <= cnt; i++) { bool flag = true; for (int j = 1; j <= cnt - i; j++) if (b[j].s < b[j + 1].s) { swap(b[j], b[j + 1]); flag = false; } else if (b[j].s == b[j + 1].s && b[j].k > b[j + 1].k) { swap(b[j], b[j + 1]); flag = false; } if (flag) break; } } int main() { // 面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m×150% // (向下取整)名的选手的分数 // 第一行,两个整数n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中n表示报名参加笔试的选手总数, // m表示计划录取的志愿者人数。输入数据保证m×150%向下取整后小于等于n。 // 第二行到第 n+1行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000≤k≤9999) // 和该选手的笔试成绩s(1≤s≤100)。数据保证选手的报名号各不相同。 // 第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的 // 实际人数。从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和 // 笔试成绩,按照笔成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。 cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i].k >> a[i].s; int tmp = floor(m * 1.5), cnt = 0, scoreline, x = 1; buble(n, a); scoreline = a[tmp].s; cout << scoreline << ' '; for (int i = 1; i <= n; i++) if (a[i].s >= scoreline) { b[x++] = a[i]; cnt++; } cout << cnt << endl; buble(cnt, b); for (int i = 1; i <= cnt; i++) cout << b[i].k << ' ' << b[i].s << endl; return 0; } ``` 我全部ac了
by Enoch2013 @ 2023-11-14 21:12:01


|