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;
}
相关推荐
白山编程大哥2 分钟前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao22 分钟前
算法34,位运算符操作,总结
算法
Navigator_Z35 分钟前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z1 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
FOORIR1 小时前
3D视觉+AI客流系统怎么做:从Sensor Pipeline到数据事件引擎
算法
Omics Pro3 小时前
Arc研究所Cell|全新虚拟细胞官方基准评测框架
大数据·人工智能·深度学习·算法·机器学习
白狐_7983 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
CoderYanger5 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
小雨笙笙5 小时前
机器学习:评估模型与选择
人工智能·算法·机器学习
高亦真5 小时前
今天是学习嵌入式的第35天
linux·学习·算法