523 字
3 分钟
ABC354 C - Atcoder Magics 题解
ABC354 C - Atcoder Magics
题目翻译
问题陈述
高桥有纸牌游戏 “AtCoder Magics”中的 张卡片。其中的第 张卡片将被称为 卡片 。每张卡片都有两个参数:强度和成本。卡片 的强度为 ,成本为 。
他不喜欢弱牌,所以他会弃掉它们。具体来说,他会重复下面的操作,直到无法再进行为止:
- 选择两张卡片 和 ,即 和 。弃牌 。
可以证明,当无法再进行这些操作时,剩余卡片的集合是唯一确定的。请找出这组卡片。
限制因素
- 都是不同的。
- 都是不同的。
- 所有输入值均为整数。
输出
剩下的卡片有 张,按升序排列为 张。按以下格式打印:
解题思路
定义一个结构体,存储卡片的编号、强度、成本,并以强度大小的顺序将结构体排序。
枚举比较成本。若 小于它前面所有卡片的成本的最低值,不满足 且 ,没有卡片能弃掉卡片 ,便存入答案数组。
遍历后能得到剩余卡片的集合。升序排序后输出。
总结
考察对结构体排序的应用。
sort cmp函数与结构体排序应用 - Dark_Modest
示例代码
#include <bits/stdc++.h>using namespace std;#define int long long#define endl '\n'
const int N = 2e5+5;int minn = 1e9+1;struct card{ int id; int a; int c;} m[N];int n;vector<int> ans;
bool cmp(card x, card y){ return x.a > y.a;}
signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n; for(int i = 1; i <= n; i++){ cin >> m[i].a >> m[i].c; m[i].id = i; } sort(m + 1, m + n + 1, cmp); for(int i = 1; i <= n; i++){ if(minn > m[i].c){ minn = m[i].c; ans.push_back(m[i].id); } } sort(ans.begin(), ans.end()); cout << ans.size() << endl; for(int i = 0; i < ans.size(); i++){ cout << ans[i] << " "; } return 0;} ABC354 C - Atcoder Magics 题解
https://darkmodest.github.io/posts/solutions/abc354c/