OCAC暑期比赛第二场 A题 教练的组队安排 题解

教练的组队安排
原题链接:http://codeforces.com/problemset/problem/432/A
【题目描述】
大学里面有一个类似中学生NOIP比赛的赛事叫做ACM-ICPC国际大学生程序设计竞赛。
(不过最近听说赛事的主办方从ACM协会变更成了Jetbrains,所以大家现在好像就直接称呼其为ICPC国际大学生程序设计竞赛)
ICPC比赛和NOIP比赛有一些区别,其中一个区别就是比赛是组队形式的,一个队伍由3个人组成。
(当然还有其他一些区别,比如ICPC比赛是可以带纸质资料的,ICPC题目描述是英文的,ICPC比赛的时候是会发一大袋零食的,ICPC比赛每AC一道题是会挂一个气球的,等等……但是因为和题目描述没啥关系所以你可以把这句话当废话囧)
ICPC的比赛是有一些层级的,比如各省会举办省赛,东三省和内蒙古还会举办在省赛之后的一个月左右举办一场ICPC东四省赛,以增进东北各高校之间的感情。
在此之上就是被称为 reginal 的亚洲区预赛(国家级),每年在亚洲都会有多个站点举办亚洲区域赛,在中国每年就会有五六个站点,在每个站点的前几名都有机会晋级到被称为 world final 的世界总决赛。
一码大学的ICPC集训队有 n 个大神选手,作为一码大学ICPC集训队的教练,汪老师决定组建一些队伍来参加亚洲区域赛,争取能够出线参加世界总决赛。
今年学校给的名额比较多,所以汪老师想要集中精力选出一些队伍,使得每个队伍都能够参加 k 场亚洲区域赛。
但是,亚洲区域赛对于参赛选手有一些限制,其中一个限制就是同一个参赛选手最多只能参加 5 场区域赛。
这意味着如果汪老师准备给每个队伍参加亚洲区域赛的场次 k 大于这个选手剩下的参加亚洲区域赛的场次,那么他就不能够加入汪老师的队伍。
汪老师每次去参加比赛,都会带上这些队伍,一共参加了 k 场亚洲区域赛。并且队伍一旦成立,队员是固定的,这就是说如果一开始聪聪和灵灵、豪豪组成了队伍,那么这 k 场比赛都是灵灵、聪聪、豪豪三个人一起比赛。
汪老师现在知道ICPC集训队中 n 个大神选手已经参加过的亚洲区域赛的次数,请你帮忙计算他能够组建的队伍的最大数量 m ,使得他能够带领这 m 个队伍同时参加 k 场亚洲区域赛。
【输入格式】
输入的第一行包含两个正数 n 和 k (1<=n<=2000;1<=k<=5),分别表示大神选手的人数,及准备参加的亚洲区域赛的场次。
第二行包含n个整数:y1,y2,……,yn (0<=yi<=5),其中 yi 表示第 i 个选手已经参加过的亚洲区域赛的场次。
【输出格式】
输出包含一个整数,表示汪老师按照上述要求能够组建的最多队伍数量。
【样例输入1】
5 2
0 4 5 1 0
【样例输出1】
1
【样例输入2】
6 4
0 1 2 3 4 5
【样例输出2】
0
【样例输入3】
6 5
0 0 0 0 0 0
【样例输出3】
2
【题目提示】
在样例1中,汪老师可以选择1,4,5三个人组成一队参加2场比赛;
在样例2中,汪老师没有办法选出3个能参加比赛的人,事实上只有1,2两个人能够参加4场比赛;
在样例3中,6个人都能够参加5场比赛,所以我们可以选择任意3个人组成一队,另外3个人组成另一队,成立2个队伍。
【题目分析】
本题涉及算法:贪心。
我们只需要将 n 个人按照参加比赛的次数从小到大排个序,然后从左到右3个3个判断能不能一起参加比赛,
能的话队数加1,遍历后3个;不能的话,退出循环。
最后输出队数就可以了。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int n, k, y[2020], cnt;

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i ++) cin >> y[i];
    sort(y, y+n);
    for (int i = 0; i+2 < n; i += 3) {
        if (y[i+2] + k <= 5) cnt ++;
        else break;
    }
    cout << cnt << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11130935.html