第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; }