CF441A Valera and Antique Items 题解

Content

一个人有 \(v\) 块钱,他有认识的 \(n\) 位商家做拍卖活动,第 \(i\) 位商家出售 \(k_i\) 件商品,其中的第 \(j\) 件商品的价格是 \(s_{i,j}\)。只要这个人有足够的钱拍下第 \(i\) 位商家的任何一件商品,他就能够和这个商家达成协议。现在问他最多可以和多少个商家达成协议,并且

数据范围:\(1\leqslant n,k_i\leqslant 50,10^4 \leqslant v,s_{i,j}\leqslant 10^6\)

Solution

这个题目思路非常的清晰。只需要边输入,边把每个商家出售的商品的价格的最小值求出来,然后和 \(v\) 比较就好了。记录完答案之后无需排序,因为我们是一边输入一边记录答案,所以可以保证这个答案序列是升序的。这就是一边输入一边记录答案的优点所在。

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int n, ans[57], ansnum, v;
struct seller {
	int k, price[57], minprice;
}a[57];

int main() {
	scanf("%d%d", &n, &v);
	for(int i = 1; i <= n; ++i) {
		a[i].minprice = 0x3f3f3f3f;	//求最小值初始化必须要大于数据的最大值,这里是因为习惯了就写了0x3f3f3f3f(即为16进制数3F3F3F3F,也就是十进制下的1061109567),这个数今后还会比较常见
		scanf("%d", &a[i].k);
		for(int j = 1; j <= a[i].k; ++j) {
			scanf("%d", &a[i].price[j]);
			a[i].minprice = min(a[i].minprice, a[i].price[j]);
		}
		if(a[i].minprice < v)
			ans[++ansnum] = i;
	}
	printf("%d\n", ansnum);
	for(int i = 1; i <= ansnum; ++i)
		printf("%d ", ans[i]);
	return 0;
}
posted @ 2021-12-23 20:17  Eason_AC  阅读(19)  评论(0)    收藏  举报