牛客对于题目链接: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;
}
三、反思与改进
思路正确,但对结构体中属性的值进行大小比较不熟悉,导致没有写出正确结果。