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;
}
posted @ 2023-05-25 21:43  Bloodstalk  阅读(8)  评论(0编辑  收藏  举报