yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

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