前言:
萌新第一次发博客, 知识储备不足,纯属自嗨
今天俱乐部进行的地一次选拔赛,抱着长见识的想法试着做了做题目,然后果然被虐的自闭了
一个半小时只做出来一道题,而且还是暴力破解法…
就是这个:
不久以后,一场信息学奥林匹克竞赛将在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
37
输入样例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
看到这个题目我首先想到的就是最近学习的循环结构但是看的匆忙理解错了题意以为是一等奖获奖名额满了之后才会轮到二等奖接着是三等奖,然鹅敲出代码后才想到这样的话二等奖三等奖可能没人得啊…接着又苦逼的重新思考…
然后就敲出了这样的超无脑代码:
#include<stdio.h>
int main()
{
int n,min1,min2,min3,max1,max2,max3,left_n;
scanf("%d",&n);
scanf("%d%d",&min1,&max1);
scanf("%d%d",&min2,&max2);
scanf("%d%d",&min3,&max3);
if(min1<=max1&&min2<=max2&&min3<=max3&&(min1+min2+min3)<=(max1+max2+max3))
{
left_n = n-min1-min2-min3;
if(left_n>0)
{
if(left_n>(max1-min1))
{
printf("%d “,max1);
left_n = left_n-(max1-min1);
if(left_n>(max2-min2))
{
printf(”%d “,max2);
left_n = left_n-(max2-min2);
printf(”%d",min3+left_n);
}
else
printf("%d %d",min2+left_n,min3);
}
else
printf("%d %d %d",min1+left_n,min2,min3);
}
else
printf("%d %d %d",min1,min2,min3);
}
return 0;
}
先保证三个奖项有最少获奖者,接着开始依次分配,先往一等奖里塞人,能塞满就往二等奖里塞,塞不满就输出总人数减去其他两个奖最少得奖人数,二等奖能塞满三等奖就是总人数减去一二等奖总人数,塞不满就输出总人数减去一等奖总人数和三等奖最少人数.
总结:
通过这次比赛再次认识到了我的无知,其实还是自己基本知识还没掌握好,见识的题目太少而且解题语言绝对可以更简便,主要是被虐and以后要坚持被虐…再回过头来看这么菜的自己还是有点心酸…不过还是要加油呀.