NECプログラミングコンテスト2021(AtCoder Beginner Contest 229) C - Cheese
問題の要約
今,目の前にN種類のチーズがある。
i種類目のチーズは1[g]あたりのおいしさがAiで,Bi[g]ある。
ピザのおいしさは,ピザに乗せたチーズのおいしさの総和で決まる。
乗せたチーズの重さは合計でW[g]以下である必要がある。
この条件のもとで,可能なピザのおいしさの最大値を求めよ。
制約
入力はすべて整数
1<=N<=3*10^5
1<=W<=3*10^8
1<=Ai<=10^9
1<=Bi<=1000
入力
N W
A1 B1
A2 B2
...
AN BN
考え方
1,問題文から1[g]あたりのおいしさがAiであるので,W[g]以下とあるが,W[g]だけ考えればよい。
2,ほかに条件がないことから,おいしさが大きい順にチーズをW[g]乗せればよい。
おいしさAiと重さBiをpairで受け取り,降順にソートすればよい。
あとは順番にBiがW以下の時とWより大きい時の条件分岐でしてチーズをのせればよい。
実際のプログラム
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(){
long long N,W;
cin >> N >> W;
vector<pair<long long,long long>> AB(N);
for(long long i = 0; i < N; i++){
long long A,B;
cin >> A>> B;
AB[i] = make_pair(A,B);
}
sort(AB.begin(),AB.end(),greater<pair<long long,long long>>());
long long ans = 0;
for(long long i = 0; i < N; i++){
if(AB[i].second <= W){
W = W - AB[i].second;
ans = ans + AB[i].first * AB[i].second;
}else{
ans = ans + AB[i].first * W;
break;
}
}
cout << ans << endl;
return 0;
}