思路:
开 n 个 multiset,记录每种口味的美味值。
开 1 个 set,记录每个口味的美味值的最大值。
通过 set 的排序特点,取出两个不同口味的美味值得最大值进行计算,更新最大值。
遍历每个口味,取出每个口味的最大的两个美味值进行计算,更新最大值。
输出。
代码:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#define endl '\n'
#define int long long
#define pint pair<long long, long long>
#define IL inline
using namespace std;
const int N = 3e5 + 10;
const int INF = 0x3f3f3f3f;
set <pint> s;
multiset <int> p[N];
pint a[N];
signed main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
int f, q;
cin >> f >> q;
a[i] = {f, q};
p[f].emplace(q);
}
for(int i = 1;i <= n;i++)
{
auto q = p[a[i].first].end();
q--;
s.insert({a[i].first, *q});
}
auto e = s.end();
e--;
int ans = 0;
ans += (*e).second;
if(s.size() == 1)
{
ans = 0;
}
else
{
e--;
ans += (*e).second;
}
for(auto i = s.begin();i != s.end();i++)
{
int qwq = (*i).first;
auto g = p[qwq].end();
g--;
if(p[qwq].size() == 1) continue;
int ux = (*g);
g--;
int uy = (*g);
ans = max(ans, ux + uy / 2);
}
cout << ans << endl;
return 0;
}