简单题解
2026-05-28 15:08:28
发布于:日本
33阅读
0回复
0点赞
这题把价值从大到小排序完以后
先拿住最大美味的
然后无非两种情况
1.另一个同口味
2.另一个其他口味
根据公式 比较两种情况即可,因为根据美味程度排序 所以只要便利一部分
|
#include<bits/stdc++.h>
using namespace std;
struct ice{
int fi;//口味
int si;//美味
}a[300010];
bool cmp(ice c1, ice c2){
return c1.si > c2.si;
}
int main(){
// 提高输入效率,防止 3*10^5 数据量导致超时(TLE)
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i].fi >> a[i].si;
}
sort(a, a + n, cmp);
int t1 = 0; // 存放口味不同的最大满意度
int t2 = 0; // 存放口味相同的最大满意度
// 方案一:找第一个和 a[0] 口味不同的冰淇淋
for(int i = 1; i < n; i++){
if(a[i].fi != a[0].fi){
t1 = a[0].si + a[i].si;
break; // 找到了美味度最高的不同口味,立刻收工
}
}
// 方案二:如果全场第二名 a[1] 刚好和第一名 a[0] 口味相同
if(a[1].fi == a[0].fi){
t2 = a[0].si + a[1].si / 2;
}
// 两个方案取最大的那个,就是终极答案
cout << max(t1, t2) << endl;
return 0;
}
全部评论 1
有没有可能不拿最美味那个呢?
没有
简单证明一下(决策空间分析):假设最优解是取 a[1] 和 a[2](不取 a[0])。
因为 a[0].si 是全场最大的数值:
1.如果 a[1] 和 a[2] 口味不同:a[0] 至少能和其中一个口味不同。用 a[0] 替换掉口味不同的那个,总和一定会变大(或相等)。
2.如果 a[1] 和 a[2] 口味相同:得分是 a[1].si + a[2].si / 2。如果你用 a[0] 去和 a[1] 配对,无论口味同不同,算出来的得分都一定 a[1].si + a[2].si / 2。2026-05-28 来自 日本
1

有帮助,赞一个