http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=52099
有三只球队,一共有n场比赛,然后现在进行了k场,不知道输赢,只知道第一和第二的分数差是d1,第二和第三的分数差是d2,
问这样比赛是不是可能出现平局,注意每一场比赛没有平局。
如果n%3 != 0,肯定不会使得三个队伍平手,输出“no”。
设三个队在前K场比赛中分别赢了x1,x2,x3场,有|x1 - x2| = d1, | x2 - x3| = d2。
由于d1,d2分别有正负,共分为四种情况:
{x1 - x2 = d1, x2 - x3 = d2},{x1 - x2 = d1, x3 - x2 = d2},{x2 - x1 = d1, x2 - x3 = d2},{x2 - x1 = d1,x3 - x2 = d2}
只要有一种情况有可行解即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int main(){ 5 int T; 6 ll n,m,d1,d2; 7 scanf("%d",&T); 8 while (T--){ 9 scanf("%I64d%I64d%I64d%I64d",&n,&m,&d1,&d2); 10 ll s,d,s1,s2,s3,D1,D2,d3,k=n-m; 11 d=m-(d1+2*d2); 12 s=k-(2*d1+d2); 13 D1=m-(d1+d2); 14 s1=k-(max(d1,d2)+abs(d1-d2)); 15 D2=m-(max(d1,d2)+abs(d1-d2)); 16 s2=k-(d1+d2); 17 d3=m-(2*d1+d2); 18 s3=k-(d2*2+d1); 19 if ((s % 3==0 && s>=0) && (d>=0 && d % 3==0)) puts("yes"); 20 else if ((s1 % 3==0 && s1>=0) && (D1>=0 && D1 % 3==0)) puts("yes"); 21 else if ((s2 % 3==0 && s2>=0) && (D2>=0 && D2 % 3==0)) puts("yes"); 22 else if ((s3 % 3==0 && s3>=0) && (d3>=0 && d3 % 3==0)) puts("yes"); 23 else puts("no"); 24 } 25 return 0; 26 }
时间: 2024-11-11 02:43:12