Java对顶级编码器程序的回答在测试用例中失败了,我不知道为什么
我试图解决topcoder问题,我的解决方案适用于所有示例输入,但我现在尝试运行的示例输入除外它应该输出92时输出48。我知道这与Java对顶级编码器程序的回答在测试用例中失败了,我不知道为什么,java,Java,我试图解决topcoder问题,我的解决方案适用于所有示例输入,但我现在尝试运行的示例输入除外它应该输出92时输出48。我知道这与函数中的if(minDefeatable>=bestCase){return bestCase;}有关。我知道这一点,因为如果我删除它,它会给出这个特定测试用例的正确答案,但随后会停止处理其他测试用例。为了弄明白这一点,非常感谢任何帮助 问题陈述 魔法女孩是指拥有魔力的女孩。他们与邪恶作斗争以保护地球。宇宙的敌人刚刚袭击了地球,魔法女孩们将与他们战斗。 你会得到一个描
函数中的if(minDefeatable>=bestCase){return bestCase;}
有关。我知道这一点,因为如果我删除它,它会给出这个特定测试用例的正确答案,但随后会停止处理其他测试用例。为了弄明白这一点,非常感谢任何帮助
问题陈述
魔法女孩是指拥有魔力的女孩。他们与邪恶作斗争以保护地球。宇宙的敌人刚刚袭击了地球,魔法女孩们将与他们战斗。
你会得到一个描述魔法女孩的魔法女孩力量:对于每个i,魔法女孩力量[i]是其中一个女孩的力量。你也被赋予了一个敌人的力量和一个描述他们敌人的敌人:对于每个我,都有一个敌人,每个人都有力量。
每个魔法女孩每次都会与一个敌人战斗。如果一个神奇的女孩的力量大于或等于她的敌人的力量,她就会打败她的敌人
在战斗开始时,每个魔法女孩的疲劳度为0。每当一个神奇的女孩击败敌人,她的疲劳增加1。
魔法女孩们想打败所有的敌人。也就是说,每个敌人都必须被一个魔法女孩打败。此外,魔法女孩们希望最大限度地减少疲劳。
如果无法击败所有敌人,返回-1。否则,返回具有以下属性的最小F:魔法女孩可以击败所有敌人,最终每个女孩的疲劳度最多为F
尝试解决方案(带主测试失败的测试用例)
导入java.util.array;
公共类太空舱2{
公共静态int最小疲劳(int[]女孩力量,int[]敌人力量,int[]敌人力量){
数组。排序(girlStrength);
int girlsLeft=girlStrength.length;
int-enemiesLeft=sumInts(enemyCount);
int[]canDefeat=新int[girlsleet];
CalcDefeat(女孩力量、敌人力量、敌人数量、坎迪费特);
if(canDefeat[canDefeat.length-1]1){
bestCase=(int)Math.ceil((双)enemiesLeft/(双)GirlslLeft);
如果(minDefeatable>=最佳案例){
返回最佳案例;
}否则{
canDefeat=Arrays.copyOfRange(canDefeat,1,canDefeat.length-1);
女孩左——;
enemiesLeft-=精神可食性;
减去整数(canDefeat、mindefeat);
minDefeatable=canDefeat[0];
}
}
返回canDefeat[0];
}
//将一个女孩可以击败的最大敌人数放入一个数组,canDefeat,返回其索引
//有最低可击败计数的女孩
public static void calcDefeatable(int[]girlStrength,int[]enemyStrength,int[]enemyCount,int[]canDefeat){
int numGirls=围梁强度长度;
int enemyGroups=敌人力量长度;
int可击败=0;
对于(int i=0;i=敌人的力量[j]){
可击败+=电子账户[j];
}
}
坦率的[我]=可击败的;
可击败=0;
}
}
公共静态整数消耗(整数[]整数){
整数和=0;
for(int i=0;i
输入/输出示例
我猜第一个测试应该是7,第二个测试应该是-1?没错。我用输入/输出示例更新了这个问题。我不确定min Deastable是什么意思。但是你忽略了你剩下的盟友很少,需要打败大量敌人的情况。它存在于第一个循环中,显然最好的情况不可能比56更好,因为只有一个女孩可以击败大于80的敌人。不要试图让你的循环短路,过早的优化是万恶之母。我猜第一个测试应该是7,第二个测试应该是-1?没错。我用输入/输出示例更新了这个问题。我不确定min Deastable是什么意思。但是你忽略了你剩下的盟友很少,需要打败大量敌人的情况。它存在于第一个循环中,显然最好的情况不可能比56更好,因为只有一个女孩可以击败大于80的敌人。不要试图缩短你的循环,过早的优化是万恶之母。
import java.util.Arrays;
public class SpaceWarDiv2 {
public static int minimalFatigue(int[] girlStrength, int[] enemyStrength, int[] enemyCount) {
Arrays.sort(girlStrength);
int girlsLeft = girlStrength.length;
int enemiesLeft = sumInts(enemyCount);
int[] canDefeat = new int[girlsLeft];
calcDefeatable(girlStrength, enemyStrength, enemyCount, canDefeat);
if (canDefeat[canDefeat.length-1] < enemiesLeft) return -1;
int minDefeatable = canDefeat[0];
int bestCase;
while (girlsLeft > 1) {
bestCase = (int) Math.ceil((double)enemiesLeft/(double)girlsLeft);
if (minDefeatable >= bestCase) {
return bestCase;
} else {
canDefeat = Arrays.copyOfRange(canDefeat, 1, canDefeat.length - 1);
girlsLeft--;
enemiesLeft -= minDefeatable;
subtractFromInts(canDefeat, minDefeatable);
minDefeatable = canDefeat[0];
}
}
return canDefeat[0];
}
// Puts the max number of enemies a girl can defeat into an array, canDefeat, returns the index of
// girl with the lowest defeatable count
public static void calcDefeatable(int[] girlStrength, int[] enemyStrength, int[] enemyCount, int[] canDefeat) {
int numGirls = girlStrength.length;
int enemyGroups = enemyStrength.length;
int defeatable = 0;
for (int i = 0; i < numGirls; i++) {
for (int j = 0; j < enemyGroups; j++) {
if(girlStrength[i] >= enemyStrength[j]) {
defeatable += enemyCount[j];
}
}
canDefeat[i] = defeatable;
defeatable=0;
}
}
public static int sumInts(int[] ints) {
int sum = 0;
for (int i = 0; i < ints.length; i++) {
sum += ints[i];
}
return sum;
}
public static void subtractFromInts(int[] ints, int value) {
for (int i = 0; i < ints.length; i++) {
ints[i] -= value;
}
}
public static void main(String[] args) {
int[] girlStrength1 = {2, 3, 5};
int[] enemyStrength1 = {1, 3, 4};
int[] enemyCount1 = {2, 9, 4};
int[] girlStrength2 = {14, 6, 22};
int[] enemyStrength2 = {8, 33};
int[] enemyCount2 = {9, 1};
int[] girlStrength3 = {17, 10, 29, 48, 92, 60, 80, 100, 15, 69, 36, 43, 70, 14, 88, 12, 14, 29, 9, 40};
int[] enemyStrength3 = {93, 59, 27, 68, 48, 82, 15, 95, 61, 49, 68, 15, 16, 26, 64, 82, 7, 8, 92, 15};
int[] enemyCount3 = {56, 26, 12, 52, 5, 19, 93, 36, 69, 61, 68, 66, 55, 28, 49, 55, 63, 57, 33, 45};
System.out.println(SpaceWarDiv2.minimalFatigue(girlStrength3, enemyStrength3, enemyCount3));
}
}