小球装箱游戏

问题 C: 小球装箱游戏

时间限制: 1.000 Sec  内存限制: 128 MB
提交 状态

题目描述

乐乐小朋友正在玩一个小球装箱的游戏。现在有 N 个小球(编号为 1 到 N),每个小球 有一种颜色(红色或者绿色),并且每个小球上都标有一个数字。现在有两个不同的球箱 A 和 B,乐乐想把这些球放进这两个球箱里面,并且保证:
1.每个球箱中球的数量要一样多。
2.球箱 A 中的任意一个球上的数字不小于球箱 B 中任意一个球上的数字。
3.如果红色小球和绿色小球上的数字相同时,红色小球优先放入球箱 A。
装箱完成后,乐乐想知道 A、B 两个球箱中红色小球和绿色小球各有多少个。由于球的数量比较多,请你编程计算一下吧。

输入

输入共N+1行。
第1行是一个整数N(2≤N≤100000),表示小球的总数。
接下来N行,第i+1行两个整数Mi(1≤Mi≤20000)和Pi(Pi为0或者1),其中
Mi表示第i个小球上面的数字,Pi表示第i个小球的颜色,0表示小球是红色,1表示小球是绿色。
数据保证球的个数N为偶数。

输出

输出共 2 行。
第 1 行两个整数,分别表示球箱 A 中红色小球和绿色小球的数量。 第 2 行两个整数,分别表示球箱 B 中红色小球和绿色小球的数量。

样例输入 Copy

6
1 1
3 0
2 1
4 1
6 0
5 0

样例输出 Copy

2 1
1 2

提示

有8个小球,其中有3个标有数字2的红色小球,标有数字1、2、4、5、8的绿色小球各1个。将标有数字4、5、8的3个绿色小球和1个标有数字2的红色小球放入球箱A,将另外2个标有数字2的红色小球,1个标有数字2的绿色小球和1个标有数字1的绿色小球放入球箱B。注意,放入球箱A中标有数字2的小球是红色,因为它比标有数字2的绿色小球更优先放入球箱A
对于60%的数据,1≤N≤10000,1≤Mi≤10000,且保证各小球上标有的数字都不一样。
对于100%的数据,1≤N≤100000,1≤Mi≤20000。 

 c++多关键字排序:

#include<iostream>
#include<utility>
#include<algorithm>
using namespace std;
typedef pair<int,int>A;
A a[100010];
bool cmp(A e,A r)
{
	if(e.first>r.first)return true;
	if(e.first==r.first)
	{
		if(e.second<r.second)return true;
		return false;
	}
	return false;
}
int main()
{
	long  n;
	cin>>n;
	int Ar=0,Ag=0,Br=0,Bg=0;
	for(long i=1;i<=n;i++)
	{
		int aa,bb;
		cin>>aa>>bb;
		a[i]={aa,bb};
	}
	sort(a+1,a+n+1,cmp);
	for(long i=1;i<=n;i++)
	{
		if(i<=n/2)
		{
			if(a[i].second==0)Ar+=1;
			if(a[i].second==1)Ag+=1;
		}
		if(i>n/2)
		{
			if(a[i].second==0)Br+=1;
			if(a[i].second==1)Bg+=1;
		}
	}
	cout<<Ar<<" "<<Ag<<endl;
	cout<<Br<<" "<<Bg; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值