CF659C Tanya and Toys题解
题目大意
你有 \(n\) 个已经买了的玩具,还有 \(m\) 元,求最多还可以买多少个不重复的玩具(玩具的编号等于花费)。
思路
贪心
要买最多个,就要使得玩具的价值最小。于是我们就从最小的 \(1\) 开始枚举,找到没买的就加上,一直加到总价值大于 \(m\) 为止。
考虑数据范围, \(m \leq 10^9\) 单纯用数组来模拟桶肯定不行,所以我们考虑用 map ,用 map 来做,暴力解决问题。
代码实现
#include<bits/stdc++.h>
using namespace std;
map <int,int> mp;/*存已经出现过的玩具*/
map <int,int> cun;/*存要购买的玩具*/
int n,m,cnt;
long long tot;/*保险起见,开long long*/
int main()
{
/*freopen("toys.in","r",stdin);
freopen("toys.out","w",stdout);*/
scanf("%d%d",&n,&m);
int a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
mp[a]=1;/*之前买了,就不能买重复的了*/
}
for(int i=1;i<=1e9;i++)/*1到1e9扫一遍*/
{
if(mp[i] == 0)/*贪心,没买过就加上*/
{
if(tot+i <= m)
{
cun[++cnt]=i;
tot+=i;
}
else/*超出限制了就输出*/
{
printf("%d\n",cnt);/*买的物品个数*/
for(int j=1;j<=cnt;j++)
printf("%d ",cun[j]);/*物品编号*/
return 0;
}
}
}
return 0;
}