洛谷 U138347 贩卖武器

洛谷 U138347 贩卖武器

洛谷传送门

题目背景

SeawaySeawa**y所效命的AlphaAlpha国和邪恶的EulerEuler国之间关系越来越紧张,空气中的火药味很浓。二国决定尽快买入足够的武器以防万一。军备竞赛始终是国力竞争的重要一环,AlphaAlpha国必然不会让自己在开战之前就陷入劣势。所以,AlphaAlpha国人民委员会任命SeawaySeawa**y为军工采购部部长,全面负责买入武器的工作......

题目描述

两国都有自己的武器供应商,而且两个武器供应商都有NN种武器可卖(两国所卖的武器不可能相同)。每种武器都有一个杀伤力k_ik**i。每次,每国可以在两种操作中选择一种:

第一种:在自己的供应商中选择一种武器买入。

第二种:在对方的供应商中选择一种武器摧毁。摧毁的意义是,这种武器既不可以被自己买入,也不可以被对手买入。

显然,如何选择这两种操作直接决定了两国武器质量的优劣。假设EulerEuler国的军工采购部部长和SeawaySeawa**y都很聪明,每次都会选择最优的操作。那么,请判断:AlphaAlpha国的武器质量(也就是所有买入武器的杀伤力之和)能否大于EulerEuler国的武器质量,并求出二者差值。

输入格式

从文件weapon.inweapo**n.i**n中读入数据。

第一行一个整数NN,接下来的两行,每行NN个整数,分别表示AlphaAlpha国,EulerEuler国的武器供应商所提供的每种武器的杀伤力k_ik**i

输出格式

输出到文件weapon.outweapo**n.out中。

第一行为YESYES和NON**O,表示AlphaAlpha国的武器质量能否大于EulerEuler国的武器质量。第二行输出一个整数ansans,表示两者差值。


题解:

很容易想的贪心。

代码:

#include<cstdio>
#include<queue>
#define int long long
using namespace std;
int n,ansa,ansb;
priority_queue<int> q[3];
//q[1]:A q[0]:B
signed main()
{
	scanf("%I64d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%I64d",&x);
		q[1].push(x);
	}
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%I64d",&x);
		q[0].push(x);
	}
	q[1].push(-1);
	q[0].push(-1);
	int tot=n*2;
	for(int i=1;i<=tot;i++)
	{
		int a=q[1].top();
		int b=q[0].top();
		if(i&1)//a's turn
		{
			if(a<b)
				q[0].pop();
			else
			{
				q[1].pop();	
				ansa+=a;
			}
		}
		else//b's turn
		{
			if(b<a)
				q[1].pop();
			else
			{
				q[0].pop();
				ansb+=b;
			}
		}
	}
	printf("%I64d",ansa-ansb);
	return 0;
	// if(ansa>ansb)
	// {
	// 	puts("YES");
	// 	printf("%I64d\n",ansa-ansb);
	// 	return 0;
	// }
	// else
	// {
	// 	puts("NO");
	// 	printf("%I64d\n",ansb-ansa);
	// 	return 0;
	// }
}
posted @ 2020-11-16 09:23  Seaway-Fu  阅读(50)  评论(0编辑  收藏  举报