题目:
问题描述
一年一度的蓝桥杯大赛又要开始了!
今年,组委会突发奇想,搞了个男女搭配,干活不累的团队赛(新模式),每个参赛团队必须由两名男生和一名女生组成。
小蓝就读的家里蹲大学也是蓝桥杯的参赛院校之一。听说要举办团队赛后,他摩拳擦掌,准备大展身手。
只是,家里蹲大学的领导却突然宣布,为了鼓励学生全面发展,要从包括小蓝在内的 N 名男生和 M 名女生中,选出 K 名优秀学生,送去参加一个重要的,em...全国青少年挖掘机技能特训冬令营。这个集训的时间正好和蓝桥杯冲突,这意味着被选中的同学将无法参加蓝桥杯比赛。
这突如其来的消息,让小蓝和同学们有点措手不及。现在,大家都想知道,在送走了 K 名同学之后,家里蹲大学最多还能组建多少个团队参加蓝桥杯的团队赛。
输入格式
数据有多组。
第一行输入一个整数 T (1 ≤ T < 10),表示数据的组数。
接下来的 T 行,每行输入三个整数 N、M、K (0 ≤ N, M < 10^9, 0 ≤ K < N+M),分别表示男生人数、女生人数和需要派去参加特训的学生人数。
输出格式
对于每组数据,输出一个整数,表示最多可以组建的团队数量。
样例输入
2
7 3 3
样例输出
1
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
PyPy3 | 3s | 256M |
Go | 3s | 256M |
JavaScript | 3s | 256M |
总通过次数:312 | 总提交次数:661 | 通过率:47.2%
难度:中等 标签:思维 数字
思路:
1.我们需要先求出没有减人数的时候,可以组成最大的队伍。注意当N < 2*M 时候,t需要N/2向下取整。举例子,M = 7,N = 5 ;则t = 3.
2.求出最大队伍后所剩余的总数allsp,如果这个allsp大于等于K,那么队伍数不变,如果allsp小于K。求出more_number = K - allsp;作为还需减去的人数。通过模拟可知,如果要保留组成最大队伍数量,那么只有减去0~3人,对队伍数才能-1。所以我们将(more_number+2)/3,向上取整。最后
t - (more_number+2)/3 就是减去人数后最大的队伍数。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll N,M,K,T;
int main() {
ios::sync_with_stdio((ll)0);
cin.tie((ll)0);
cout.tie((ll)0);
cin >> T;
while(T--)
{
cin >> N >> M >> K;
ll t;//当前最大组
if(N >= 2*M)
t = M;
else
t = N/2;
ll spman,spwomen;//剩余的
spman = N - t*2;
spwomen = M - t;
ll allsp = spman + spwomen;//剩余总数
// cout << "剩余总数:" <<allsp << '\n';
if(K <= allsp)
cout << t << '\n';
else
{
ll more_number = K - allsp;//还需要减的人数
// cout << "还需要减的人数" << more_number <<'\n';
t = t - (more_number+2)/3;
cout << max(0LL,t) << '\n';
}
}
return 0;
}