Divide The Students

最近,一群学生被伯兰州立大学计算机科学学院录取。现在编程老师想把他们分成三个小组进行练习。

老师知道很多程序员都在争论哪种语言是最好的。老师不想听到小组中的任何争论,所以她想把学生分成三个小组,这样就不会有一对属于同一小组的学生想争论。

为了进行这个划分,老师问每个学生他喜欢哪种编程语言。有 a 个学生回答说他们喜欢汇编程序,b 个学生说他们最喜欢的语言是Basic,剩下的 c 个学生声称C++是最好的编程语言。

汇编程序爱好者和c++爱好者之间存在着很大的争论。

现在,知道汇编程序和C++程序每分钟都可以开始一场争论,老师想把学生分成三个子组,这样每个学生都只属于一个子组,不存在包含至少一个汇编程序粉丝和至少一个C++粉丝的子组。由于教很多学生可能很困难,老师希望最大子群的大小尽可能小。

请帮助老师计算最大子群的最小的可能大小!

输入

第一行包含一个整数t(1 ≤t ≤5)------输入中的测试用例数。然后是测试用例。

每个测试用例由一行组成,其中包含三个整数a、b和c(1 ≤ a,b,c ≤ 1000)------分别是汇编程序、Basic和C++风扇的数量。

输出

对于每个测试用例,打印一个整数------如果学生被划分为不存在同时包含至少一个汇编程序的同学和至少一个C++的同学的子群,则最大子群的最小大小。

Input1

5

3 5 7

4 8 4

13 10 13

1000 1000 1000

13 22 7

Output1

5

6

13

1000

14

Input2

5

1 3 4

1000 1000 1

4 1 2

325 226 999

939 861 505

Output2

3

667

3

517

769

复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int a,b,c;
void solve()
{
    cin>>a>>b>>c;
    int cnt=b;
    if (a>c) swap(a,c);
    if (a==b&&b==c) cnt=0;
    else if (b>=a&&b>c)
    {
        while (b>a||b>c)
        {
            if (a>c)
            {
                b--;
                c++;
                cnt--;
            }
            else 
            {
                a++;
                b--;
                cnt--;
            }
        }
    }
    if (c>b||(b>a&&cnt!=0))
    {
        while (c>b||(b>a&&cnt!=0))
        {
            if (b>a&&cnt!=0)
            {
                a++;
                b--;
                cnt--;
            }
            else
            {
                b++;
                c--;
            }
        }
    }
    cout<<max({a,b,c})<<endl;
}
signed main()
{
    ios;
    int T;
    cin>>T;
    //T=1;
    while (T--) solve();
    return 0;
}

另一个思路:

复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int a,b,c;
void solve()
{
    cin>>a>>b>>c;
    if (a>c) swap(a,c);
    if (a+b<(c+1) /2) cout<<(c+1) /2<<endl;
    else 
    {
        int ans=max((a+b+c+2) /3,a);
        cout<<ans<<endl;
    }
}
signed main()
{
    ios;
    int T=1;
    cin>>T;
    while (T--) solve();
    return 0;
}
相关推荐
gfdhy5 分钟前
【Linux】服务器网络与安全核心配置|静态IP+SSH加固+防火墙,公网服务器必学实操
linux·服务器·网络·tcp/ip·算法·安全·哈希算法
Frostnova丶14 分钟前
LeetCode 1888 使二进制字符串交替的最少翻转次数
算法·leetcode
王码码203518 分钟前
Flutter for OpenHarmony:es_compression — 高性能 Brotli 与 Zstd 算法实战
算法·flutter·elasticsearch
白鲸开源26 分钟前
(三)ODS/明细层落地设计要点:把数据接入层打造成“稳定可运维”的基础设施
大数据·数据结构·数据库
苏纪云1 小时前
蓝桥杯知识点——day2
数据结构·算法·蓝桥杯
Wect1 小时前
LeetCode 52. N 皇后 II:回溯算法高效求解
前端·算法·typescript
iFlyCai1 小时前
数据结构与算法之希尔排序
数据结构·算法·排序算法
lcreek1 小时前
LeetCode2208. 将数组和减半的最少操作次数、LeetCode2406.将区间分为最少组数
python·算法
shehuiyuelaiyuehao1 小时前
算法1,移动零
数据结构·算法·排序算法
shehuiyuelaiyuehao1 小时前
算法2,复写零
数据结构·算法