0
点赞
收藏
分享

微信扫一扫

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

回溯 2023-04-20 阅读 86


CodeForces - 557A


Ilya and Diplomas



Submit 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



Codeforces Round #311 (Div. 2)




#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;
}




Time Limit: 1000MS

 

Memory Limit: 262144KB

 

64bit IO Format: %I64d & %I64u

举报

相关推荐

0 条评论