程序功能:根据输入的数据,计算出满足一定条件的排名和分数的数量。
设计思路及结构说明:
- 首先,定义了一个'pair<int, int>'的vector数组'vpii',用来存储排名和分数的对。
- 然后,定义了一个'bool'类型的数组'vis',用来标记已经被访问过的排名。
- 接着,定义了一个'bool'类型的数组'check',用来标记已经满足条件的排名。
- 在'solve'函数中,首先输入'n'、'k'和's'的值,分别表示排名和分数的数量以及分数的阈值。
- 接着,通过循环输入每个排名和分数的值,并将排名大于等于175的数据存储到'vpii[0]'中。
- 将'vpii[0]'按照排名进行升序排序。
- 定义变量'ans'用来记录满足条件的排名和分数的数量,'dex'用来记录循环的次数,'len'用来记录当前'vpii[dex & 1]'的长度。
- 在每次循环中,首先将'vis'数组置为false。
- 然后,遍历'vpii[dex & 1]',对于每个排名和分数的对,如果该排名没有被访问过,则将其标记为已访问,将'check'数组对应位置置为true,并将'ans'加1。
- 如果该排名已经被访问过,但是分数大于等于阈值's',则将'check'数组对应位置置为true,并将'ans'加1。
- 如果该排名已经被访问过,且分数小于阈值's',则将该排名和分数的对存储到'vpii[!(dex & 1)]'中,即存储到下一次循环的'vpii'中。
- 清空当前'vpii[dex & 1]',即删除已经访问过的排名和分数的对。
- 'dex'加1,用来记录下一次循环。
- 最后,输出'ans'的值,即满足条件的排名和分数的数量。
#include
#include
#include
#include
#include
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
using pii = pair<int, int>;
const int maxn = 1e5 + 5;
vector vpii[2];
bool vis[300];
bool check[maxn];
void solve() {
int n, k, s;
scanf("%d%d%d", &n, &k, &s);
for (int i = 0, rank, pta; i < n; i++) {
scanf("%d%d", &rank, &pta);
if (rank >= 175)vpii[0].push_back({rank,pta});
}
sort(vpii[0].begin(), vpii[0].end());
int ans = 0, dex = 0, len;
while (k--) {
memset(vis, false, sizeof vis);
len = vpii[dex & 1].size();
for (int i = 0; i < len; i++) {
if (!vis[vpii[dex & 1][i].first]) {
vis[vpii[dex & 1][i].first] = true;
check[i] = true;
++ans;
}
else if (vpii[dex & 1][i].second >= s) {
check[i] = true;
++ans;
}
else {
vpii[!(dex & 1)].push_back(vpii[dex & 1][i]);
}
}
vpii[dex & 1].clear();
++dex;
}
cout << ans << endl;
}
int main() {
ios, tie;
solve();
return 0;
}