(悬关)简单の贪心的橙题求助QAQ
查看原帖
(悬关)简单の贪心的橙题求助QAQ
704668
WZWZWZWY楼主2023/10/10 10:44
#include <bits/stdc++.h>
using namespace std;

vector <int> a[300005];

int n,m,k[300005];
bool vis[300005];

bool check(const int maxd){
	//for (int i = 1; i <= maxd; i++) cnt[i] = 0;
	int need_day = 0;
	for (int i = 1; i <= n; i++) vis[i] = 0;
	for (int i = 1; i <= n; i++) {
		int maxd_i = 0;
			for (int j = 0; j < a[i].size(); j++) 
				if (a[i][j] > maxd_i && a[i][j] <= maxd) maxd_i = a[i][j];//找到<=maxd的最大的一天 
		int now = maxd_i;
		int cnt = 0;
		while (now && cnt < k[i]){
			if (!vis[now]) cnt++,vis[now]=1;
			now--;
		}
		need_day += (k[i]-cnt)*2 + cnt;
	}
	//cout << need << " " << maxd << " " << bool (need <= maxd) << "\n";
	return need_day <= maxd;
}

int main(){
	int sum_k=0;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> k[i],sum_k += k[i];
	for (int i = 1; i <= m; i++) {
		int d,t;
		cin >> d >> t;
		a[t].push_back(d);
	}
	int l = sum_k, r = sum_k*2, mid;
	while (l <= r){
		mid = (l+r) / 2;
		if (check(mid)) r = mid-1;
		else l = mid+1;
		//cout << l << " " << r << "\n";
	}
	cout << l;
}

check中心是从当前天往前找在这之前赚到没有花出去的最多的钱,贪心的想法

但是WA on 18

2023/10/10 10:44
加载中...