牛客对于题目链接:chika和蜜柑 (nowcoder.com)
一、分析题目
排序 :将每个橘⼦按照甜度由高到低排序,相同甜度的橘子按照酸度由低到高排序, 然后提取排序后的前 k 个橘子就好了。
二、代码
1、看题解之前AC的代码
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N=200010; struct fruits { LL a; LL b; static bool cmp(const fruits& x, const fruits& y) { if(x.b==y.b) return x.a<y.a; return x.b>y.b; } }f[N]; int main() { int n, k; cin >> n >> k; for(int i=0; i<n; i++) cin >> f[i].a; for(int i=0; i<n; i++) cin >> f[i].b; sort(f, f+n, fruits::cmp); LL sum_a=0, sum_b=0; for(int i=0; i<k; i++) { sum_a+=f[i].a; sum_b+=f[i].b; } cout << sum_a << ' ' << sum_b << endl; return 0; }
2、值得学习的代码
#include <iostream> #include <algorithm> using namespace std; const int N = 2e5 + 10; typedef pair<int, int> PII; // <酸度,甜度> PII arr[N]; int n, k; int main() { cin >> n >> k; for(int i = 0; i < n; i++) cin >> arr[i].first; for(int i = 0; i < n; i++) cin >> arr[i].second; sort(arr, arr + n, [&](const PII& a, const PII& b) { if(a.second != b.second) return a.second > b.second; else return a.first < b.first; }); long long s = 0, t = 0; for(int i = 0; i < k; i++) { s += arr[i].first; t += arr[i].second; } cout << s << " " << t << endl; return 0; }
三、反思与改进
思路正确,但对结构体中属性的值进行大小比较不熟悉,导致没有写出正确结果。