[ABC297E] Kth Takoyaki Set 题解

传送门

题意简述

给定 $ n $ 件商品,第 $ i $ 件商品的价格为 $ A_i $,选一些商品可以组成一些价格,同一件商品可被重复选择任意多次。问这些价格中第 $ k $ 大的是多少。

Solution

注意一个细节,题目注重的仅仅是价格,而非方案,因此 多种不同的选择方案得到的同一个价格只算一次。 基于这个性质,使用 set 自带的去重功能来解决此题。

考虑到 $ n $ 很小,只有 $ 10 $,因此可以每次把最小的价格取出来,依次加上每个 $ A_i $ 再放回去,重复 $ k-1 $ 次后 set 内的第一个元素即为答案。初始化将每个 $ A_i $ 都放入 set 内,保证不漏算价格。总复杂度为 $ O(NK) $。

代码示例

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//注意long long
ll n,k,a[200010];
set<ll> s;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i],s.insert(a[i]);
	//set中此时已有第1小的价格,因此重复k-1次可得到第k小的价格
   	for(int i=1;i<=k-1;i++){
		ll num=*s.begin();
		s.erase(num);
		for(int j=1;j<=n;j++) s.insert(num+a[j]);
	}
	cout<<(*s.begin())<<endl;
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值