CodeForces - 557A Ilya and Diplomas (模拟)水

CodeForces - 557A
Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u

 Status

Description

不久以后,一场信息学奥林匹克竞赛将在BERLAND举行,很多学生都要参加。
 
赛事组委会决定,每一名参赛的选手都可以获得奖励,分别是一等奖或者二等奖或者三等奖,每个人只能获得一个奖励。
 
他们还决定,一等奖最少有min1人,最多有max1人,二等奖最少有min2人,最多有max2人,三等奖最少有min3人,最多有max3人。
 
那么现在问题出来,有n个学生参加了这个比赛,如何分配一等奖、二等奖、三等奖的名额,才能使得这些名额数量满足条件。
注意:题目给出的数据一定能够分配好。

Input

题目第一行是一个正整数n,表示学生的人数(1<=n<=3*10^6)。
第二行两个正整数表示min1和max1,1<=min1<=max1<=10^   6。
第三行两个正整数表示min2和max2,1<=min2<=max3<=10^   6。
第四行两个正整数表示min3和max3,1<=min2<=max3<=10^   6。
保证:min1+min2+min3<=n<=max1+max2+max3

Output

输出一行3个整数,表示每种奖励分配的名额,中间用空格隔开。
输出的答案为:首先要保证一等奖的人数尽量多,在一等奖人数一样的情况下,二等奖人数尽量多,二等奖人数一样的情况下,三等奖尽量多。

Sample Input

输入样例1:
6
1 5
2 6
3 7
 
输入样例2:
10
1 2
1 3
1 5
 
输入样例3:
6
1 3
2 2
2 2

Sample Output

输出样例1:
1 2 3
 
输出样例2:
2 3 5
 
输出样例3:
2 2 2

Source

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define N 1000010
using namespace std;
struct zz
{
	int mi;
	int ma;
}p[4];
int a[3],b[3];
int main()
{
	int n,i,j;
	while(scanf("%d",&n)!=EOF)
	{
		int sum=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(i=1;i<=3;i++)
		{
			scanf("%d%d",&p[i].mi,&p[i].ma);
			a[i]=p[i].ma-p[i].mi;	
			sum+=p[i].mi;
		}
		if(sum==n)
		{
			printf("%d %d %d\n",p[1].mi,p[2].mi,p[3].mi);
		}
		else
		{
			int num=n-sum;
			if(num<=a[1])
				b[1]=p[1].mi+num,num=0;
			else
			{
				b[1]=p[1].ma;
				num-=a[1];
			}
			if(num<=a[2])
				b[2]=p[2].mi+num,num=0;
			else
			{
				b[2]=p[2].ma;
				num-=a[2];
			}
			if(num<=a[3])
				b[3]=p[3].mi+num,num=0;
			else
			{
				b[3]=p[3].ma;
				num-=a[3];
			}
			printf("%d %d %d\n",b[1],b[2],b[3]);
		}
		
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值