Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对顶级编码器程序的回答在测试用例中失败了,我不知道为什么_Java - Fatal编程技术网

Java对顶级编码器程序的回答在测试用例中失败了,我不知道为什么

Java对顶级编码器程序的回答在测试用例中失败了,我不知道为什么,java,Java,我试图解决topcoder问题,我的解决方案适用于所有示例输入,但我现在尝试运行的示例输入除外它应该输出92时输出48。我知道这与函数中的if(minDefeatable>=bestCase){return bestCase;}有关。我知道这一点,因为如果我删除它,它会给出这个特定测试用例的正确答案,但随后会停止处理其他测试用例。为了弄明白这一点,非常感谢任何帮助 问题陈述 魔法女孩是指拥有魔力的女孩。他们与邪恶作斗争以保护地球。宇宙的敌人刚刚袭击了地球,魔法女孩们将与他们战斗。 你会得到一个描

我试图解决topcoder问题,我的解决方案适用于所有示例输入,但我现在尝试运行的示例输入除外它应该输出92时输出48。我知道这与
函数中的
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));
    }
}