首页 > 解决方案 > Codejam 2020 资格赛第 3 题...逻辑有什么问题?

问题描述

我采用的方法是创建 3 个数组:一个用于每个事件的开始时间,一个用于结束时间,一个用于可能的任务分配。我将第三个数组重置为每个元素都包含“x”。然后,我首先使用以下逻辑检查任务是否与任何先前分配的任务重叠,从而将所有可能的任务分配给 Cameron:

然后我按照类似的逻辑将任务分配给 Jamie。然后,如果有多个空插槽之一,则打印 IMPOSSIBLE,否则打印答案。请检查代码:

import java.lang.*;
import java.util.*;
import java.io.*;

public class Solution {


    public static void main (String [] args){

        //Scanner
        Scanner input = new Scanner(System.in);


        int T = input.nextInt();    //test cases

        for(int i=0; i<T; i++){

            int x = i+1;    //test case number
            int N = input.nextInt();


            int [] S = new int [N];     //start time
            int [] E = new int [N];     //end time
            char [] y = new char [N];   //answer

            char C = 'C';   //Cameron
            char J = 'J';   //Jamie
            int flag = 0;   //1 if impossible


            for(int j=0; j<N; j++)  //setting all slots to x
                y[j] = 'x';

            for(int j=0; j<N; j++){     //taking input
                S[j] = input.nextInt();
                E[j] = input.nextInt();
            }

            y[0] = C;   //assigning C to first task

            for(int j=1; j<N; j++){ //assigning rest of C's
                for(int k=0; k<j; k++){

                    if(y[k] == C){
                        if((S[j]<S[k] && E[j]<= S[k]) || (S[j]>=E[k] && E[j]> E[k])){
                            y[j] = C;
                        }
                        else{
                            y[j] = 'x';
                            break;
                        }
                    }
                }
            }


            for(int j=1; j<N; j++){     //assigning J to first empty slot 
                if(y[j] == 'x'){
                    y[j] = J;
                    break;
                }
            }

            for(int j=1; j<N; j++){     //assigning rest of J's
                if(y[j] == 'x'){
                    for(int k=0; k<j; k++){

                        if(y[k] == J){
                            if((S[j]<S[k] && E[j]<= S[k]) || (S[j]>=E[k] && E[j]> E[k])){
                                y[j] = J;
                            }
                            else{
                                y[j] = 'x';
                                break;
                            }
                        }
                    }
                }

            }

            for(int j=0; j<N; j++){     //Check if there is empty slot
                if(y[j] == 'x'){
                    flag = 1;
                    break;
                }
            }
            String Y = "";  //Answer

            if(flag == 1){
                Y = "IMPOSSIBLE";
                System.out.println("Case #" + x + ": " + Y);
            }

            else{
                for(int j=0; j<N; j++)
                    Y += y[j];

                System.out.println("Case #" + x + ": " + Y );
            }
        }
    }
}

由于某种原因,我一直在获得 WA。为什么逻辑不正确?

标签: java

解决方案


而不是创建 3 个数组,您应该创建许多数组,每个数组包含 3 个元素(开始时间、结束时间、入口索引)。然后根据 starttime 对这些数组进行排序。这是一个未加权的间隔调度问题,您可以在这里查看描述:http ://www.cse.psu.edu/~ads22/courses/cmpsc465/S12/lec-notes/CMPSC465-S12-Lec-17 -greedy-algs.pptx.pdf


推荐阅读