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;
}
相关推荐
数据与人工智能律师1 小时前
加密货币投资亏损后,能否以“欺诈”或“不当销售”索赔?
大数据·网络·算法·云计算·区块链
努力学习的小廉1 小时前
我爱学算法之—— 二分查找(下)
算法
AdSet聚合广告1 小时前
APP广告变现,开发者如何判断对接的广告SDK安全合规?
大数据·后端·算法·安全·uni-app
不二狗2 小时前
每日算法 -【Swift 算法】实现回文数判断!
开发语言·算法·swift
野犬寒鸦3 小时前
Redis核心数据结构操作指南:字符串、哈希、列表详解
数据结构·数据库·redis·后端·缓存·哈希算法
佩奇的技术笔记3 小时前
Python入门手册:Python中的数据结构类型
数据结构·python
梁下轻语的秋缘4 小时前
Python人工智能算法 模拟退火算法求解01背包问题:从理论到实践的完整攻略
人工智能·python·算法·数学建模·模拟退火算法
Smile灬凉城6664 小时前
IPsec协议
考研·数学·算法
信息化未来4 小时前
python 生成复杂表格,自动分页等功能
开发语言·数据结构·python
xsh2195 小时前
贪心算法套路模板+详细适用场景+经典题目清单
算法