diff --git a/kshiraishi/src/B147.java b/kshiraishi/src/B147.java new file mode 100644 index 0000000000000000000000000000000000000000..ea582de7c46339a5451e47f561d7336ad5660265 --- /dev/null +++ b/kshiraishi/src/B147.java @@ -0,0 +1,176 @@ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +/** + * スライムの王 自分以下のスライムを取り込んで一番でかくなる + * + * + * + * @author kshiraishi + * @version 1 + */ +public class B147 { + + public static class SlimeData { + private int slimeCount; + private int slimeSize; + private List slimeSizeList = new ArrayList<>(); + private int targetSlimeSize = 0; + private int absorbCount = 0; + private int maxSlimeSizeInCountry = 0; + + public int getMaxSlimeSizeInCountry() { + return this.maxSlimeSizeInCountry; + } + public int getSlimeCount() { + return this.slimeCount; + } + public int getSlimeSize() { + return this.slimeSize; + } + public List getSlimeSizeList() { + return this.slimeSizeList; + } + public int getTargetSlimeSize() { + return this.targetSlimeSize; + } + public int getAbsorbCount() { + return this.absorbCount; + } + + public void setMaxSlimeSizeInCountry(int maxSlimeSizeInCountry) { + this.maxSlimeSizeInCountry = maxSlimeSizeInCountry; + } + public void setSlimeCount(int slimeCount) { + this.slimeCount = slimeCount; + } + public void setSlimeSize(int slimeSize) { + this.slimeSize = slimeSize; + } + public void setSlimeSizeList(Integer slimeSizeList) { + this.slimeSizeList.add(slimeSizeList); + } + public void setTargetSlimeSize(int targetSlimeSize) { + this.targetSlimeSize = targetSlimeSize; + } + public void setAbsorbCount(int absorbCount) { + this.absorbCount = absorbCount; + } + } + + public static void main(String[] args) { + SlimeData mySlimeData = initialize(); //初期化 + + // 国で一番大きいスライムの大きさを計算し設定 + List allSlimeSizes = new ArrayList<>(mySlimeData.getSlimeSizeList()); + allSlimeSizes.add(mySlimeData.getSlimeSize()); + + //自分を含めて最大サイズの計算 + Collections.sort(allSlimeSizes); + if (!allSlimeSizes.isEmpty()) { + mySlimeData.setMaxSlimeSizeInCountry(allSlimeSizes.get(allSlimeSizes.size() - 1)); + } else { + // スライムがいない場合、自分が最大とみなす + mySlimeData.setMaxSlimeSizeInCountry(mySlimeData.getSlimeSize()); + } + + Collections.sort(mySlimeData.getSlimeSizeList(), Collections.reverseOrder()); + + // 自分が既に一番大きいスライムの場合 + if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { + System.out.println(0); // 吸収は不要なので-1を出力 + return; // プログラムを終了 + } + + int finalResult = -1; + //boolean canBeKing = false; + while ( mySlimeData.getSlimeSize() <= mySlimeData.getMaxSlimeSizeInCountry() ) { + //自分以上のスライムがいるか判定(いなかったら終了) + + updateTargetSlime(mySlimeData); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) + if (mySlimeData.getTargetSlimeSize() != -1) { + // 吸収できるスライムがいる場合 + absorbWeakerSlimes(mySlimeData); // 自分の大きさ+吸収するスライムの大きさ + } + // ループの途中で王になったかチェック(ここで break することも可能) + if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { + // スライム王になっていれば取込回数を出力する + finalResult = mySlimeData.getAbsorbCount(); + } + + } + /* + // ループ終了後の最終結果の判定 + if (canBeKing) { + finalResult = mySlimeData.getAbsorbCount(); + } else if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { + // ループを抜けた時点で自分が最大のスライムより大きくなっていれば、王になれた + finalResult = mySlimeData.getAbsorbCount(); + } else { + // 王になれない場合 (finalResult は -1 のまま) + finalResult = -1; + } + */ + // canBecomeKing が false の場合、finalResult は初期値の -1 のまま + System.out.println(finalResult); + } + + + + + public static B147.SlimeData initialize() { + Scanner sc = new Scanner(System.in); + SlimeData gemeState = new SlimeData(); + gemeState.setSlimeCount(sc.nextInt()); + gemeState.setSlimeSize(sc.nextInt()); + for(int i = 0; i < gemeState.getSlimeCount(); i++) { + gemeState.setSlimeSizeList(sc.nextInt()); + } + sc.close(); + return gemeState; + } + + /* + //自分以上のスライムがいたらtrue + public static boolean isBiggerSlime(B147.SlimeData gemeState) { + for(int i=0; i= gemeState.getSlimeSizeList().get(i)) { + maxAbsorbSlimeSize = gemeState.getSlimeSizeList().get(i); + targetIndex = i; + break; + } + } + // 見つかったスライムをリストから削除 + if (targetIndex != -1) { + gemeState.getSlimeSizeList().remove(targetIndex); + } + // 最終的な取り込み候補のサイズを設定 + gemeState.setTargetSlimeSize(maxAbsorbSlimeSize); +} + + //スライムを取り込む + 取り込み回数+1 + public static void absorbWeakerSlimes(B147.SlimeData gemeState){ + //取り込めるスライムがいるか + if(gemeState.getTargetSlimeSize() != -1) { + gemeState.setSlimeSize(gemeState.getSlimeSize() + gemeState.getTargetSlimeSize()); //今の大きさ+取り込むスライムの大きさ + gemeState.setAbsorbCount(gemeState.getAbsorbCount() + 1 ); //取り込んだ回数カウントup + } + } + +}