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;
}