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;
}
相关推荐
2301_764441332 小时前
LISA时空跃迁分析,地理时空分析
数据结构·python·算法
东北洗浴王子讲AI2 小时前
GPT-5.4辅助算法设计与优化:从理论到实践的系统方法
人工智能·gpt·算法·chatgpt
Billlly3 小时前
ABC 453 个人题解
算法·题解·atcoder
玉树临风ives3 小时前
atcoder ABC 452 题解
数据结构·算法
feifeigo1234 小时前
基于马尔可夫随机场模型的SAR图像变化检测源码实现
算法
fengfuyao9854 小时前
基于STM32的4轴步进电机加减速控制工程源码(梯形加减速算法)
网络·stm32·算法
无敌昊哥战神5 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
小白菜又菜5 小时前
Leetcode 2075. Decode the Slanted Ciphertext
算法·leetcode·职场和发展
Proxy_ZZ05 小时前
用Matlab绘制BER曲线对比SPA与Min-Sum性能
人工智能·算法·机器学习
黎阳之光5 小时前
黎阳之光:以视频孪生领跑全球,赋能数字孪生水利智能监测新征程
大数据·人工智能·算法·安全·数字孪生