列表

详情


ZJ2. 编程题1

描述

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



输入描述

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

输出描述

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

示例1

输入:

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分,比赛已经全部结束因此最终不能打平。

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 248KB, 提交时间: 2021-07-03

//感谢 牛客560486601号 大佬 的详细解释!!
#include <stdio.h>
int main(void)
{
    int t;
    while(scanf("%d", &t) != EOF)
    {
        long long n, k, d1, d2;
        for(int i=0; i<t; i++){
            scanf("%lld %lld %lld %lld", &n, &k, &d1, &d2);
            if( n%3 ){ printf("no\n");   continue; }
            long long avg_n = n/3;
            if(d1>avg_n || d2>avg_n){ printf("no\n");   continue; }
            if(k == n){ printf("%s\n", d1 || d2 ? "no" : "yes");   continue; }
            if(k+d1+d2>n && (k-d1-d2)/3+(d1<d2 ? d2 : d1)>avg_n)
                { printf("no\n");   continue; }
            long long tmp = n-k;
            if(!((tmp-d1-d2)%3) || !((tmp-(d1 << 1)-d2)%3) || \
               !((tmp-(d2 << 1)-d1)%3) || !((tmp-(d1<d2 ? (d2<<1)-d1 : (d1<<1)-d2))%3))
                { printf("yes\n");   continue; }
            printf("no\n");
        }
    }
    
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 332KB, 提交时间: 2021-09-10

#include<stdio.h>
typedef long long ll;
ll max(ll x, ll y)
{
    if(x>=y)
        return x;
    else
        return y;
}
ll min(ll x, ll y)
{
    if(x<=y)
        return x;
    else
        return y;
}
int main()
{
    long long t,n,k,d1,d2;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld %lld %lld %lld",&n,&k,&d1,&d2);
        long long mx,mn;
        mx = max(d1, d2);
        mn = min(d1, d2);
        int k1,k2,k3,k4;
        k1 = k2 = k3 = k4 = 0;
        if((k-d1-2*d2)>=0&&(k-d1-2*d2)%3==0&&(n-k-2*d1-d2)>=0&&(n-k-2*d1-d2)%3==0)
            k1 = 1;
        if((k-2*d1-d2)>=0&&(k-2*d1-d2)%3==0&&(n-k-d1-2*d2)>=0&&(n-k-d1-2*d2)%3==0)
            k2 = 1;
        if((k-2*mx+mn)>=0&&(k-2*mx+mn)%3==0&&(n-k-mx-mn)>=0&&(n-k-mx-mn)%3==0)
            k3 = 1;
        if((k-mx-mn)>=0&&(k-mx-mn)%3==0&&(n-k-2*mx+mn)>=0&&(n-k-2*mx+mn)%3==0)
            k4 = 1;
        if(k1||k2||k3||k4)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 348KB, 提交时间: 2021-03-02

#include <stdio.h> 
int judge(long n, long l, long k, long d1, long d2);
int clac(long l, long k, long a, long b, long c);
int main ()
{
    long t, n, k, d1, d2, r, l;
    scanf("%d", &t);
    while(t--){
        scanf("%lld %lld %lld %lld", &n, &k, &d1, &d2);
        l = n - k;
        r = judge(n, l, k, d1, d2);
        if (r == 1){
            printf("yes\n");
        }
        else {
            printf("no\n");
        }
        
    }
}

int judge(long n, long l, long k, long d1, long d2){
    if (!(n%3==0)){
        return 0;
    }
    if (clac(l, k, 0, 0+d1, 0+d1+d2)==1) {
        return 1;
    }
    if (clac(l, k, 0, 0+d1, 0+d1-d2)==1) {
        return 1;
    }
    if (clac(l, k, d1, 0, d2)==1) {
        return 1;
    }
    if (clac(l, k, d2+d1, d2, 0)==1) {
        return 1;
    }
    if (clac(l, k, d2-d1, d2, 0)==1) {
        return 1;
    }
    return 0;
}

int clac(long l, long k, long a, long b, long c){
    if (a<0 || b<0 || c<0){
        return 0;
    }
    long max=a>b?a>c?a:c:b>c?b:c;
    if (k>=a+b+c && (k-a-b-c)%3==0 && l>=3*max-a-b-c && (l-(3*max-a-b-c))%3==0){
        return 1;
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 480KB, 提交时间: 2019-03-16

#include <stdio.h>
  
  
long max(long a, long b , long c){
    return a > b ? a > c ? a : c : b > c ? b : c;
}
  
int check(long l , long k , long a , long b , long c){
    if(a < 0 || b < 0 || c < 0){
        return 0;
    }
    long mx = max(a , b , c);
    if(k >= a + b + c  && (k - a - b - c) % 3 == 0 &&  l >= 3*mx - a - b - c && (l - 3*mx + a + b + c) % 3 == 0){
        return 1;
    }
    return 0;
}
  
int main() {
    int t, i, r;
    long n, k, d1, d2, l , a , b , c;
    scanf("%d", &t);
    while (t--) {
        scanf("%lld %lld %lld %lld", &n, &k, &d1, &d2);
        l = n - k;
        r = 0;
        r = r || check(l , k , 0 , 0+d1 , d1 + d2);
        r = r || check(l , k , 0 , 0+d1 , d1 - d2);
        r = r || check(l , k , d1 , 0 , d2);
        r = r || check(l , k , d1 + d2 , d2 , 0);
        r = r || check(l , k , d2 - d1 , d2 , 0);
        if (r == 1) {
            printf("yes\n");
        } else {
            printf("no\n");
        }
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2021-06-08

#include <stdio.h>
#include <stdbool.h>
bool judge(long n, long k, long d1, long d2);
bool clac(long n, long k, long a, long b, long c);
int main()
{
    int t;
    long k, d1, d2, n;
    scanf("%d", &t);
    for (size_t i = 0; i < t; i++)
    {
        scanf("%lld %lld %lld %lld", &n, &k, &d1, &d2);
        if (judge(n, k, d1, d2))
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
}

bool judge(long n, long k, long d1, long d2)
{
    if (!(n % 3 == 0))
    {
        return false;
    }
    if (clac(n, k, 0, 0 + d1, 0 + d1 + d2))
    {
        return true;
    }
    if (clac(n, k, 0, 0 + d1, 0 + d1 - d2))
    {
        return true;
    }
    if (clac(n, k, d1, 0, d2))
    {
        return true;
    }
    if (clac(n, k, d2 + d1, d2, 0))
    {
        return true;
    }
    if (clac(n, k, d2 - d1, d2, 0))
    {
        return true;
    }
    return false;
}

bool clac(long n, long k, long a, long b, long c)
{
    long l = n - k;
    if (a < 0 || b < 0 || c < 0)
    {
        return false;
    }
    long max = a > b ? a > c ? a : c : b > c ? b
                                             : c;
    if (k >= a + b + c && (k - a - b - c) % 3 == 0 && l >= 3 * max - a - b - c && (l - (3 * max - a - b - c)) % 3 == 0)
    {
        return true;
    }
    return false;
}

上一题