ZJ2. 编程题1
描述
有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。输入描述
第一行包含一个数字 t (1 <= t <= 10)输出描述
每行的比分数据,最终三只球队若能够打平,则输出“yes”,否则输出“no”示例1
输入:
2 3 3 0 0 3 3 3 3
输出:
yes no
说明:
case1: 球队1和球队2 差0分,球队2 和球队3也差0分,所以可能的赛得分是三只球队各得1分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; }