java - Codejam 2020 资格赛第 3 题...逻辑有什么问题?
问题描述
我采用的方法是创建 3 个数组:一个用于每个事件的开始时间,一个用于结束时间,一个用于可能的任务分配。我将第三个数组重置为每个元素都包含“x”。然后,我首先使用以下逻辑检查任务是否与任何先前分配的任务重叠,从而将所有可能的任务分配给 Cameron:
- if (新任务开始时间 < 分配任务开始时间 AND 新任务结束时间 <= 分配任务开始时间) OR (新任务开始时间 >= 新任务结束时间 AND 新任务结束时间 > 结束时间分配的任务)那么这个新任务不会重叠,可以分配给 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。为什么逻辑不正确?
解决方案
而不是创建 3 个数组,您应该创建许多数组,每个数组包含 3 个元素(开始时间、结束时间、入口索引)。然后根据 starttime 对这些数组进行排序。这是一个未加权的间隔调度问题,您可以在这里查看描述:http ://www.cse.psu.edu/~ads22/courses/cmpsc465/S12/lec-notes/CMPSC465-S12-Lec-17 -greedy-algs.pptx.pdf
推荐阅读
- c++ - 如何在 C++ 中使用 lame (mp3->wav) 进行解码
- c - 了解 time_t 调用
- java - 如何在堆栈中找到一个值并使用递归将其放在顶部?
- selenium - 我可以使用 selenium 在网站上单击此元素吗?
- javascript - Greasemonkey - 使用来自其他用户脚本的一个用户脚本(作为 js 库)
- python - 计算我在列表python中删除元素的次数
- javascript - Playwright - 查找多个元素或类名
- python-3.x - 如何让我的 python 脚本根据其设置的模式确定数字是整数还是浮点数?
- powershell - PowerShell 可以替换使用 -clike 找到的区分大小写的文本部分吗?
- if-statement - 'type' object is not subscriptable - IF LOOP ERROR