Atcoder ABC297 E-G
Atcoder ABC297 E-G
E - Kth Takoyaki Set
链接:
简要题意:
问题陈述
有 \(N\) 种章鱼烧出售。一个 \(i\) -种的章鱼烧售价为 \(A_i\) 日元。
高桥总共至少会买一个章鱼烧。他可以购买多个同类章鱼烧。
求高桥可能支付的 \(K\) 个最低价格。在这里,如果有多套章鱼烧的价格相同,那么价格只计算一次。
思路:
- 我们发现求topk问题,那么想到了二分或者说堆,我们发现二分不好求解
- 想想小根堆,我们发现我们每次取出最小的数,然后暴力枚举数组,让数组与最小值相加,再丢入堆中,弹出k个即可,最后返回堆顶
- 然后记得map去重
代码:
const int N = 200005;
int n,k;
int a[N];
void solve(){
cin >> n >> k;
priority_queue<int,vector<int>,greater<int>> q;
set<int> se;
q.push(0);
for(int i = 1;i<=n;i++){
cin >> a[i];
}
int id = 0;
while(id < k){
id++;
int tp = q.top();q.pop();
for(int j = 1;j<=n;j++) {
if(se.count(tp+a[j])) continue;
se.insert(tp+a[j]);
q.push(tp+a[j]);
}
}
cout << q.top();
}
F - Minimum Bounding Box 2
组合数学+容斥 待补
G - Constrained Nim 2
sg函数 待补