[JOI精進録] 難易度7「美術展」(JOI2017/2018 本選B)

問題リンク

atcoder.jp

問題概要

N個の品物i ( 1 \le i \le N )があり、それぞれに大きさA_iと価値B_iが定められている。
この中からいくつかの品物を選び、価値の総和-(大きさの最大値-大きさの最小値)を最大化してください。

解説

AC解法(100/100点)

価値の総和をv、大きさの最大値をx、最小値をyとします。
v-(x-y)
v-x+y
v+y-x
vはどのyでも同じように増えていくので、最大値を全探索して 今までのv+yの最大値と現在探索中の値を比較更新していけばよいです。

ACコード

#include <bits/stdc++.h>
using namespace std;

int main(){
  int n; cin >> n;
  map<long long,long long> M;
  long long t=0,r=0,a,b;
  while(n--) (cin>>a>>b),M[a]+=b;
  for (auto [a,b]:M) t = max(t,a),t += b,r = max(r,t-a);
  cout << r << endl;
}

提出結果

atcoder.jp