CF441A Valera and Antique Items 題解
阿新 • • 發佈:2021-12-23
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; }