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;
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值