L1-088 静静的推荐
题目描述
关系
内容
问题分析
最初思路
思路分析
执行流程设计
伪代码如下 (超时):
input:
sort increase
while (k--) {
for (int i = 0; i < n; i++) {
if (天梯赛成绩不达标 || 已经入选) continue;
cnt++;
int j = i + 1;
while (j < n && 天梯j与i相同) {
j++;
if (未入选 && (PAT成绩达标 || 还有)) cnt++;
}
i = j - 1;
}
}
input:
sort increase
int score[N] (k - 1); //初始化为k, 表示还可以选score个同分数的人。
for (int i = 0; i < n; i++) {
if (天梯赛成绩不达标) continue;
cnt++;
标记;
int j = i + 1;
while (j < n && 天梯j与i相同) {
j++;
if (PAT成绩达标)) {
cnt++;
} else if (score[j]) {
score[j]--;
cnt++;
}
}
i = j - 1;
}
总结
代码实现
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int> pii;
const int N = 1e5 + 10;
int n, k, s, cnt;
pii a[N];
int main()
{
scanf("%d%d%d", &n, &k, &s);
for (int i = 0; i < n; i++) scanf("%d%d", &a[i].x, &a[i].y);
sort(a, a + n);
vector<int> score(300, k - 1);
for (int i = 0; i < n; i++) {
if (a[i].x < 175) continue;
cnt++;
int j = i + 1;
while (j < n && a[j].x == a[i].x) {
if (a[j].y >= s) {
cnt++;
} else if (score[a[i].x]) {
score[a[i].x]--;
cnt++;
}
j++;
}
i = j - 1;
}
printf("%d", cnt);
return 0;
}