ぐってぃのプログラミング日記

競技プログラミングやIT関係の記事を書いていくよ

C - Energy Drink Collector 

問題

atcoder.jp

考察

値段が低いもの順に昇順ソートして、低いものから買える分だけ買った値段を出力すればおーけー。
値段と本数ペアでソートしたいので、vector>を活用する。

実装

#include<iostream>
#include <vector>
#include <algorithm>
#include <map>

#define ll long long

using namespace std;

int main() {
	ll n, m;

	cin >> n >> m;

	vector<pair<ll, ll> > pairs(n);

	for (ll i = 0; i < n; i++) {
		ll a, b;
		cin >> a >> b;
		pairs[i] = make_pair(a, b);
	}

	// firstが小さい順、secondが小さい順にソート
	sort(pairs.begin(), pairs.end());

	ll ans = 0;

	for (int i = 0; i < n; i++)
	{
		if (pairs[i].second < m) {
			m -= pairs[i].second;
			ans += pairs[i].first * pairs[i].second;
		}
		else {
			ans += m * pairs[i].first;
			cout << ans << endl;
			return 0;
		}
	}	
}

とても便利なpair