公式

E - Medicine 解説 by m_99


\(1\) 日目に飲む必要がある薬は \(\sum b_i\) 錠です。この状態から日数が経過するごとに飲む必要がある薬が減っていく様子をシミュレーションし、初めて飲む必要がある薬が \(K\) 錠以下になるのが何日目かを求めます。

薬は \(a_i\) が小さい方から先に飲む必要が無くなるため、初めに \(a_i\) の昇順にソートを行います。入力で受け取った \((a_i,b_i)\) の組を昇順にソートするのは、例えばC++では以下のように書けます。

vector<pair<int,int>> p(N);
	
for(int i=0;i<N;i++){
	cin>>p[i].first>>p[i].second;
}
	
sort(p.begin(),p.end());

この後、\(p\) を先頭から見る形で上記のシミュレーションを行えば良いです。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    
	int N,K;
	cin>>N>>K;
	
	vector<pair<int,int>> p(N);
	
	for(int i=0;i<N;i++){
		cin>>p[i].first>>p[i].second;
	}
	
	sort(p.begin(),p.end());
	
	long long sum = 0;
	
	for(int i=0;i<N;i++){
		sum += p[i].second;
	}
	
	if(sum<=K)cout<<1<<endl;
	else{
		for(int i=0;i<p.size();i++){
			if(sum<=K){
				cout<<p[i-1].first+1<<endl;
				return 0;
			}
			sum -= p[i].second;
		}
		cout<<p.back().first+1<<endl;
	}
	
	return 0;
}

投稿日時:
最終更新: