第一行包含一个数字 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分,比赛已经全部结束因此最终不能打平。
import java.util.Scanner; public class solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = Integer.parseInt(sc.nextLine()); for (int i = 0; i < t; i++) { String s = sc.nextLine(); String[] ss = s.split(" "); long n = Long.parseLong(ss[0]); long k = Long.parseLong(ss[1]); long d1 = Long.parseLong(ss[2]); long d2 = Long.parseLong(ss[3]); boolean target = game(n, k, d1, d2) || game(n, k, -d1, d2) || game(n, k, d1, -d2) || game(n, k, -d1, -d2); System.out.println(target ? "yes" : "no"); } } public static boolean game(long n, long k, long d1, long d2) { long temp1 = 2 * d1 + d2; long temp2 = n - k; if (k >= temp1 && (k - temp1) % 3 == 0) { if ((temp1 + temp2) >= 0 && (temp1 + temp2) % 3 == 0 && (k - temp1) / 3 <= n / 3 && (k - temp1) / 3 + d1 <= n / 3 && (k - temp1) / 3 + d1 + d2 <= n / 3 ) return true; else return false; } else { return false; } } }
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ long int n, k, d1, d2; cin>>n>>k>>d1>>d2; if(n % 3 != 0) {cout<<"no"<<endl; continue;} int S[] = {-1,1}; bool flag = 0; for(auto s1:S){ //遍历d1,d2的正负 for(auto s2:S){ long int x1 = k -2*s1*d1 - s2*d2; if(x1%3 != 0) continue; else{ x1 /= 3; long int x2 = x1 + s1*d1; long int x3 = x2 + s2*d2; auto mi = min(min(x1,x2),x3); auto ma = max(max(x1,x2),x3); if(mi < 0) break; if(ma <= n/3) flag = 1; } } } if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
#include<iostream> using namespace std; int flag[4][2] = {{1,1},{-1,-1},{1,-1},{-1,1}}; // 两个差值的四种符号情况 int main(){ int t, f = 1; long long n, k, d1, d2; cin >> t; while(t--){ // 得到解置f为0 f = 1; cin >> n >> k >> d1 >> d2; for(int i = 0;i < 4 && f == 1;i++){ long long tempd1 = flag[i][0] * d1; long long tempd2 = flag[i][1] * d2; long long tempa = 2 * tempd1 + tempd2 + k; if(tempa < 0 || tempa % 3 != 0) continue; else{ long long a = tempa / 3; long long b = a - tempd1; long long c = k - a - b; if(b < 0 || c < 0) continue; else{ long long maxscore = (a > b ? max(a, c) : max(b, c)); long long re***axscore * 3 - a - b - c; if(res == n - k || (res < n-k && (n - k - res) % 3 == 0)) f = 0 } } if(f == 1) cout<<"no"<<endl; else cout<<"yes"<<endl; } return 0; }
class Solution { public: bool couldTie(int64_t n, int64_t k, int64_t d1, int64_t d2) { // 用s1, s2, s3分别表示三个队的头条分数 int64_t remain = n - k; // 第一个santisfy表示满足case1: s1 > s2 > s3的条件 // 此时s1 至少为d1+d2, s2至少为d2, s3至少0,k余下的场次数需是3的倍数 // 第二个santisfy为余下的场次能打成平局的条件 // s2再赢d1场,s3再赢d1+d2场, n - k余下的场次数需是3的倍数 if (Satisfy(k, d1 + 2 * d2) && Satisfy(remain, 2 * d1 + d2)) { return true; } // case2: s1 < s2 < s3 if (Satisfy(k, 2 * d1 + d2) && Satisfy(remain, d1 + 2 * d2)) { return true; } // case3: s2最小 if (Satisfy(k, d1 + d2) && Satisfy(remain, 2 * max(d1, d2) - min(d1, d2))) { return true; } // case4: s2最大 if (Satisfy(k, 2 * max(d1, d2) - min(d1, d2)) && Satisfy(remain, d1 + d2)) { return true; } return false; } bool Satisfy(int64_t remain, int64_t demand) { return (remain >= demand && ((remain - demand) % 3 == 0)); } }; int main() { Solution demo; int t; int64_t n, k, d1, d2; scanf("%d", &t); for (int i = 0; i < t; i++) { scanf("%lld%lld%lld%lld", &n, &k, &d1, &d2); printf(demo.couldTie(n, k, d1, d2) ? "yes\n" : "no\n"); } return 0; }
t = int(input()) res = [] for i in range(t): n, k, d1, d2 =[int(x) for x in input().split()] if n % 3 != 0: res.append('no') continue ## 求出三个球队的得分 if (k+2*d1+d2)%3 == 0 and (k-d1+d2)%3 == 0: x = (k+2*d1+d2) /3 y = (k-d1+d2) / 3 z = k - x - y if (x >= 0 and y >= 0 and z >= 0): score1 = x score2 = y score3 = z max_score = max(score1, score2, score3) dif1 = max_score - score1 dif2 = max_score - score2 dif3 = max_score - score3 if dif1 + dif2 + dif3 <= n - k : res.append('yes') continue if (k-2*d1+d2)%3 == 0 and (k+d1+d2)%3 == 0: x = (k-2*d1+d2) /3 y = (k+d1+d2) / 3 z = k - x - y if (x >= 0 and y >= 0 and z >= 0): score1 = x score2 = y score3 = z max_score = max(score1, score2, score3) dif1 = max_score - score1 dif2 = max_score - score2 dif3 = max_score - score3 if dif1 + dif2 + dif3 <= n - k : res.append('yes') continue if (k+2*d1-d2)%3 == 0 and (k-d1-d2)%3 == 0: x = (k+2*d1-d2) /3 y = (k-d1-d2) / 3 z = k - x - y if (x >= 0 and y >= 0 and z >= 0): score1 = x score2 = y score3 = z max_score = max(score1, score2, score3) dif1 = max_score - score1 dif2 = max_score - score2 dif3 = max_score - score3 if dif1 + dif2 + dif3 <= n - k : res.append('yes') continue if (k-2*d1-d2)%3 == 0 and (k+d1-d2)%3 == 0: x = (k-2*d1-d2) /3 y = (k+d1-d2) / 3 z = k - x - y if (x >= 0 and y >= 0 and z >= 0): score1 = x score2 = y score3 = z max_score = max(score1, score2, score3) dif1 = max_score - score1 dif2 = max_score - score2 dif3 = max_score - score3 if dif1 + dif2 + dif3 <= n - k : res.append('yes') continue res.append('no') for i in range(len(res)): print(res[i])
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { long long t; cin>>t; long long n,k,d1,d2; while(t--) { cin>>n>>k>>d1>>d2; long long x=n-k; if(x==0){ if(d1==0 && d2==0) { cout<<"yes"<<endl; }else cout<<"no"<<endl; continue; } //!!!!!因为目前一共只打了k场,所以x1+x2+x3==k if(k-2*d1-d2>=0 && (k-2*d1-d2)%3==0 && (x-(2*d2+d1))>=0 && (x-(2*d2+d1))%3==0) { //第一种情况x1<=x2<=x3 //此时x1+x2+x3=x1+(x1+d1)+(x1+d1+d2)=3x1+2d1+d2==k,因为x1=(k-2*d1-d2)/3, //x-(2*d2+d1)为三队追平比分需要的场数,后面如有多余需要均分给三队 cout<<"yes"<<endl; } else if(k-2*d1+d2>=0 && (k-2*d1+d2)%3==0 && (x-d1-d2)>=0 && (x-d1-d2)%3==0) { //第二种情况x1<=x2,x2>=x3,即x2=x1+d1,x3=x2-d2=x1+d1-d2 //此时x1+x2+x3=3x1+2d1-d2=k //若要追平,需要d1+d2场,后面如有多余要均分给三队 cout<<"yes"<<endl; } else if(k+2*d1-d2>=0 && (k+2*d1-d2)%3==0 && (x-max(d1,d2)-abs(d1-d2))>=0 && (x-max(d1,d2)-abs(d1-d2))%3==0) { //第三种情况,x1>=x2,x2<=x3,即x2=x1-d1,x3=x2+d2=x1-d1+d2 cout<<"yes"<<endl; }else if(k+2*d1+d2>=0 && (k+2*d1+d2)%3==0 && (x-(2*d1+d2))>=0 && (x-(2*d1+d2))%3==0) { //第四种情况,x1>=x2,x2>=x3,即x2=x1-d1,x3=x2-d2=x1-d1-d2 cout<<"yes"<<endl; }else cout<<"no"<<endl; } return 0; }
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int t; long int n, k, d1, d2, tmp ,left; cin >> t; while(t > 0) { t--; cin >> n >> k >> d1 >> d2; tmp = k - d1 - d1 - d2; //球队1< 球队2,球队2<球队3 if(tmp >= 0 && tmp % 3 == 0) //球队1的得分有解是大前提 { left = (n - k) - (d1 + d2 + d2); if(left >= 0 && left % 3 == 0)//剩下的场次不小于need,并且可以均分3场。 { cout << "yes" << endl; continue; } } tmp = k - d1 - d1 + d2; //球队1< 球队2,球队2>球队3 if(tmp >= 0 && tmp % 3 == 0) { left = (n - k) - (d1 + d2); if(left >= 0 && left % 3 == 0) { cout << "yes" << endl; continue; } } tmp = k + d1 + d1 + d2;//球队1> 球队2,球队2>球队3 if(tmp >= 0 && tmp % 3 == 0) { left = (n - k) - (d1 + d1 + d2); if(left >= 0 && left % 3 == 0) { cout << "yes" << endl; continue; } } tmp = k + d1 + d1 - d2;//球队1>球队2,球队2<球队3 if(tmp >= 0 && tmp % 3 == 0) { if(d1 >= d2) { left = (n - k) - (d1 + d1 - d2); } else { left = (n - k) - (d2 + d2 - d1); } if(left >= 0 && left % 3 == 0) { cout << "yes" << endl; continue; } } cout << "no" << endl; } return 0; }
#include <bits/stdc++.h> #define QAQ 0x3f3f3f3f using namespace std; int main() { long long t,n,k,d1,d2,a,b,c; scanf("%lld",&t); while(t--) { scanf("%lld %lld %lld %lld",&n,&k,&d1,&d2); if(n%3!=0) { printf("no\n"); continue; } int flag=0; for(int i=-1;1>=i;i=i+2) { for(int i1=-1;1>=i1;i1=i1+2) { long long d11=d1*i; long long d22=d2*i1; a=(k-2*d11+d22)/3; b=(k+d11+d22)/3; c=(k+d11-2*d22)/3; if(a+b+c!=k||a<0||b<0||c<0) { continue; } if(a>n/3||b>n/3||c>n/3) { continue; } printf("yes\n"); flag=1; break; } if(flag==1)break; } if(flag==0) printf("no\n"); } return 0; } /* a = (k-2*d1+d2)/3 b = (k+d1+d2)/3 c = (k+d1-2*d2)/3 */
首先考虑试题,失败不扣分,没有平局,赢了加1分,则总分就是N,如果N不能被3整除,则不能平局 然后考虑分差,如果剩余比赛(N-K)不足以弥补分差(d1+d2)那就肯定不能平局。 在考虑剩下的情况,如果是平局则每个球队得分应该都是N/3,如果其中一个球队得分大于N/3,则不能平局。 试题转换为判断当前比赛有没有球队得分超过N/3; 设最少得分的球队为M, 则三队得分有4种可能: M,M+d1,M+d2+d1; M,M+d2,M+d2+d1; M,M+d1,M+d2; M,M+d1,M+d1-d2;(假设d1大于d2) 求出M的值(M需要满足大于等于0,能被三整除),然后就可以计算出得分最高的球队,如果最高得分不高于N/3,则就算成功 (如果多个情况都满足条件,则其中有一个可以满足就行) import java.util.Scanner; public clas***ain { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); for (int i = 0; i < N; i++) { if (jump(in.nextLong(), in.nextLong(), in.nextLong(), in.nextLong())) { System.out.println("yes"); } else { System.out.println("no"); } } } public static boolean jump(Long n, Long k, Long d1, Long d2) { if (n % 3 != 0 || k > n - d1 - d2) { return false; } Long max = d1 > d2 ? d1 : d2; Long min = d1 > d2 ? d2 : d1; Long m1 = k - 2 * d1 - d2; Long m2 = k - 2 * d2 - d1; Long m3 = k - d1 - d2; Long m4 = k - 2*max + min; if ((m1 >=0 && m1 % 3 == 0 && m1/3 + d1 + d2 <= n / 3) || (m2 >=0 && m2 % 3 == 0 && m2/3 + d1 + d2 <= n / 3) || (m3 >=0 && m3 % 3 ==0 && m3/3 + max <= n / 3) || (m4 >= 0 && m4 % 3 ==0 && m4/3 + max > 0) ) { return true; } return false; } }
if (n % 3 != 0 || ((n - k) - (d1 + d2)) < 0 || (n / 3 - d1) < 0 || (n / 3 - d2) < 0) { printf("no\n"); continue; } if (((n - k) - (d1 + 2 * d2))%3==0 || ((n - k) -(d2 + 2 * d1))%3==0 || ((n - k) -(d1 + d2))%3==0) printf("yes\n"); else printf("no\n");
#include <bits/stdc++.h> using namespace std; bool F(long m, long k, long x, long y, long z){ if(x<0 || y<0 || z<0) return 0; long s=x+y+z, Max = max(x, max(y, z)); return (s<=k && (k-s)%3==0 && (3*Max-s)<=m && (m-(3*Max-s))%3==0); } int main(){ int T; long n, k, d1, d2; scanf("%d", &T); while(T--){ scanf("%ld%ld%ld%ld", &n, &k, &d1, &d2); long m = n - k; bool r = 0; r |= F(m, k, 0, d1, d1+d2); r |= F(m, k, 0, d1, d1-d2); r |= F(m, k, d1, 0, d2); r |= F(m, k, d1+d2, d2, 0); r |= F(m, k, d2-d1, d2, 0); printf("%s\n", r?"yes":"no"); } return 0; }
// 我都没创建数组,却总是提醒我数组越界 心态爆炸 求好心人解答 import java.util.*; public class Main{ public static void main(String[] args){ try(Scanner in = new Scanner(System.in)){ int t = in.nextInt(),i = 0; while(i < t){ long n = in.nextLong(); int k = in.nextInt(),d1 = in.nextInt(),d2 = in.nextInt(); System.out.println(getResult(n,k,d1,d2)); i++; } } } public static String getResult(long n,int k,int d1,int d2){ int x11 = 0,x12 = 0,x13 = 0,x21 = 0,x22 = 0,x23 = 0,x31 = 0,x32 = 0,x33 = 0,x41 = 0,x42 = 0,x43 = 0; boolean tag1 = false,tag2 = false,tag3 = false,tag4 = false; if((k + d2 - d1) / 3 == (k + d2 - d1) / 3.0){ x12 = (k + d2 - d1) / 3; x11 = d1 + x12; x13 = x12 - d2; if(x11 >= x12 && x12 >= x13 && x13 >= 0 && x11 <= k) tag1 = true; } if((k - d2 - d1) / 3 == (k - d2 - d1) / 3.0){ x22 = (k - d2 - d1) / 3; x21 = d1 + x22; x23 = x22 + d2; if(x21 >= x22 && x23 >= x22 && x22 >= 0 && x21 <= k && x23 <= k) tag2 = true; } if((k + d2 + d1) / 3 == (k + d2 + d1) / 3.0){ x32 = (k + d2 + d1) / 3; x31 = x32 - d1; x33 = x32 - d2; if(x32 >= x31 && x32 >= x33 && x33 >= 0 && x31 >= 0 && x32 <= k) tag3 = true; } if((k - d2 + d1) / 3 == (k - d2 + d1) / 3.0){ x42 = (k - d2 + d1) / 3; x41 = x42 - d1; x43 = x42 - d2; if(x42 >= x41 && x43 >= x42 && x41 >= 0 && x43 <= k) tag4 = true; } if(tag1){ int max = Math.max(Math.max(x11,x12),x13),c = Math.abs(max - x11) + Math.abs(max - x12) + Math.abs(max - x13); if(n - k >= c && (n - k - c) % 3 == 0) return "yes"; } if(tag2){ int max = Math.max(Math.max(x21,x22),x23),c = Math.abs(max - x21) + Math.abs(max - x22) + Math.abs(max - x23); if(n - k >= c && (n - k - c) % 3 == 0) return "yes"; } if(tag3){ int max = Math.max(Math.max(x31,x32),x33),c = Math.abs(max - x31) + Math.abs(max - x32) + Math.abs(max - x33); if(n - k >= c && (n - k - c) % 3 == 0) return "yes"; } if(tag4){ int max = Math.max(Math.max(x41,x42),x43),c = Math.abs(max - x41) + Math.abs(max - x42) + Math.abs(max - x43); if(n - k >= c && (n - k - c) % 3 == 0) return "yes"; } return "no"; } }