首页 > 试题广场 >

编程题1

[编程题]编程题1
  • 热度指数:25973 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
有三只球队,每只球队编号分别为球队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分,比赛已经全部结束因此最终不能打平。
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int t = in.nextInt();
       
        for (int i = 0; i < t; i++) {
            long n = in.nextLong();
            long k = in.nextLong();
            long d1 = in.nextLong();
            long d2 = in.nextLong();

            // 手动解方程,算出四种解。除以3的时候可能会抹掉小数没有关系,后面有校验
            long a1 = (k-2*d1-d2)/3;
            long b1 = (k-2*d1-d2)/3+d1;
            long c1 = (k-2*d1-d2)/3+d1+d2;

            long a2 = (k-2*d1+d2)/3;
            long b2 = (k-2*d1+d2)/3+d1;
            long c2 = (k-2*d1+d2)/3+d1-d2;

            long a3 = (k+2*d1-d2)/3;
            long b3 = (k+2*d1-d2)/3-d1;
            long c3 = (k+2*d1-d2)/3-d1+d2;

            long a4 = (k+2*d1+d2)/3;
            long b4 = (k+2*d1+d2)/3-d1;
            long c4 = (k+2*d1+d2)/3-d1-d2;

            long [][]data = {{a1,b1,c1},{a2,b2,c2},{a3,b3,c3},{a4,b4,c4}};

            String res = "no";
            for(int j=0;j<4;j++) {
                Arrays.sort(data[j]);
                // 校验a+b+c是否等于k,因为除出来的数据可能是去掉位数的
                if(data[j][0] < 0 || data[j][0]+data[j][1]+data[j][2] != k) continue;
                long x = (n-k)-(data[j][2]-data[j][0])-(data[j][2]-data[j][1]);
                if(x >= 0 && x % 3 ==0) {
                    res = "yes";
                    break;
                }
            }

            System.out.println(res);
        }

       
    }
}



发表于 2023-07-19 09:02:23 回复(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";
    }
}


发表于 2019-02-23 21:02:32 回复(4)