1. 程式人生 > 其它 >CF441A Valera and Antique Items 題解

CF441A Valera and Antique Items 題解

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