HDU мульти-десятые поле школы 1008 Монеты - приоритет очереди жадный +

Тема ссылки: точка I ах ╭ (╯ ^ ╰) ╮

С учетом эффекта:

    Have N N множество монет, каждая монета имеет две я , б я a_i, b_i
    В ответ на просьбу прийти К К монеты максимальное значение е ( К ) F (K)
    ограничение набора монет: я a_i Не торопитесь, чтобы не принимать б я b_i
    умолять е ( 1 ) , е ( 2 ) , , , , е ( К ) е (1), е (2), ... F (K)

Проблемно-разрешающие идеи:

    Потому что б я b_i Ограничения, поэтому не локальный оптимум глобальный оптимум ,
    но думать об этом, если предположить , что ток принял К К монет, и является оптимальным
    учитываякак выиграть монеты:
     : ①: Прямые принятьчто максимальный ток монеты может принять
     : ②: Заменить первый дубль К К монеты, а затем взять самую большую группу монеткоторыенастоящее время могут принимать

    Бездумный не нашел третий случая, третий случай уже включен в оптимальном решении в выше
    так записывать он может принимать различные монеты и получил первые из нескольких
    с тем, что вы можете поддерживать очереди приоритета

Core: + жадные трахает очередь приоритетов

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int T, n, ans[maxn], th2[maxn], th[maxn];
struct node1{
	int x, id, th;
	bool operator < (const node1 &A) const{
		return x < A.x;
	}
};
struct node2{
	int x, y, id;
	bool operator < (const node2 &A) const{
		return x + y < A.x + A.y;
	}
}; 
priority_queue <node1> q1;
priority_queue <node2> q2;

int main() {
	scanf("%d", &T);
	while(T--){
		scanf("%d", &n);
		while(!q1.empty()) q1.pop();
		while(!q2.empty()) q2.pop();
		for(int i=1, a, b; i<=n; i++){
			scanf("%d%d", &a, &b);
			th2[i] = b, th[i] = 0;
			q1.push({a, i, 0});
			q2.push({a, b, i});
		}
		int f = 0, prex, preid, a, b;
		for(int i=1; i<=n*2; i++){
			while(th[q1.top().id]!=q1.top().th && !q1.empty()) q1.pop();
			while(th[q2.top().id]!=0 && !q2.empty()) q2.pop();
			a = q1.top().x;
			b = (f&&!q2.empty()) ? q2.top().x + q2.top().y - prex : 0;
			if(a <= b){	//	取 2个 
				f = 0;
				ans[i] = ans[i-1] + b;
				th[q2.top().id] = 2;
				q1.push({prex, preid, --th[preid]});
				q2.pop();
			} else {	//	取 1个 
				f = 1;
				ans[i] = ans[i-1] + a;
				prex = q1.top().x, preid = q1.top().id;
				q1.pop();
				if(!th[preid]) q1.push({th2[preid], preid, 1});
				++th[preid];
			}
			printf("%d%c", ans[i], " \n"[i==n*2]);
		}
	}
}
Опубликовано 221 оригинальные статьи · вона похвала 220 · просмотров 20000 +

рекомендация

отblog.csdn.net/Scar_Halo/article/details/103835040
рекомендация