【测开笔试】三只球队的分数打平

有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。

时间限制:C/C++ 2秒,其他语言4秒

空间限制:C/C++ 64M,其他语言128M

输入描述:

第一行包含一个数字 t (1 <= t <= 10)
接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n <= 10^12; 0 <= k <= n, 0 <= d1, d2 <= k)

输出描述:

每行的比分数据,最终三只球队若能够打平,则输出“yes”,否则输出“no”

输入例子:

2
3 3 0 0
3 3 3 3

输出例子:

yes
no

例子说明:

case1: 球队1和球队2 差0分,球队2 和球队3也差0分,所以可能的赛得分是三只球队各得1分
case2: 球队1和球队2差3分,球队2和球队3差3分,所以可能的得分是 球队1得0分,球队2得3分, 球队3 得0分,比赛已经全部结束因此最终不能打平。

题解

#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t) {
        t--;
        long long n, k, d1, d2;
        cin >> n >> k >> d1 >> d2;
        if (n % 3 == 0) {                    //总赛数必须为3的倍数才可能均分
            if (n == k) {                    //比赛已结束时
                if (d1 == 0 && d2 == 0) {    
                    cout << "yes" << endl;
                }
                else {
                    cout << "no" << endl;
                }
                continue;
            }
            else {                          //比赛未结束
                if ((d1+d2)<(n-k)) {        //剩余赛数必须大于差的总数,不然追比不上
                    if ((n - k - d1 - d2) % 3 == 0) {
                        cout << "yes" << endl;
                        continue;
                    }
                    if ((n - k - d1 - 2*d2) % 3 == 0) {
                        cout << "yes" << endl;
                        continue;
                    }
                    if ((n - k -2*d1 - d2) % 3 == 0) {
                        cout << "yes" << endl;
                        continue;
                    }
                    if ((d1 > d2) && ((n - k - 2*d1 + d2) % 3 == 0)) {
                        cout << "yes" << endl;
                        continue;
                    }
                    if ((d2 > d1) && ((n - k + d1 - 2*d2) % 3 == 0)) {
                        cout << "yes" << endl;
                        continue;
                    }
                    else {                      //以上情况都不成立则不能拉平
                        cout << "no" << endl;
                        continue;
                    }
                }
                else {                     //剩余赛数小于差的总数,追比不上
                    cout << "no" << endl;
                    continue;
                }
            }
        }
        else {             //总赛数必须为3的倍数才可能均分
            cout << "no" << endl;
            continue;
        }
    }
    return 0;
}

思考be like:

一开始漏了一个else的情况,所以通过率只有16%,换了本地编译器,在第五个样例才发现问题。

样例输入

样例输入:

10
258385599125 78092069277 6824838688 39628564455
961358140081 172524445203 168643038048 703076070
183413115088 61006893426 42630932464 7201202280
448053313254 171971692805 50323825411 13453364400
282398722857 278340973669 37290210123 16512004042
296233191093 21735861291 5394721649 15478838524
448264125858 87301326439 76304721876 5156086809
733774364611 580351746525 13381971740 116560212382
583722032663 125450580360 7293880654 19868130882
133923316342 3749675927 911719959 1194948085

样例输出:

no
no
no
yes
no
yes
no
no
no
no

知识点:贪心、2018、数学、测试开发工程师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值