寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #B - 古本屋 (Books)

第10回日本情報オリンピック 本選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#B - 古本屋 (Books)

https://www.ioi-jp.org/joi/2010/2011-ho-tasks_data/2011-ho.pdf#page=4

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#B - 古本屋 (Books)
https://www.ioi-jp.org/joi/2010/2011-ho-tasks_data/2011-ho.pdf#page=4
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void replace_max(ll& n,ll m){
  if(n<m){
    n=m;
  }
}
int main(void){
  ll n,k;
  cin>>n>>k;
  vector<vector<ll>> g(11);
  for(ll i=0;i<n;i++){
    ll C,G;
    cin>>C>>G;
    g[G].push_back(C);
  }
  vector<ll> dp(k+1);
  for(ll i=1;i<=10;i++){
    sort(g[i].rbegin(),g[i].rend());
    vector<ll> dp2=dp;
    ll sum=0;
    for(ll j=0;j<(ll)g[i].size();j++){
      sum+=g[i][j];
      for(ll l=0;l<=k-j-1;l++){
        replace_max(dp2[l+j+1],dp[l]+j*(j+1)+sum);
      }
    }
    dp=dp2;
  }
  cout<<dp[k]<<endl;
  return 0;
}