From f837dd823992d13b4e0eb0d1bb5c8dee33ffcb2b Mon Sep 17 00:00:00 2001 From: kshiraishi Date: Thu, 3 Jul 2025 15:02:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?B147=E3=81=AE=E5=9B=9E=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kshiraishi/src/B147.java | 120 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 kshiraishi/src/B147.java diff --git a/kshiraishi/src/B147.java b/kshiraishi/src/B147.java new file mode 100644 index 0000000..b17782b --- /dev/null +++ b/kshiraishi/src/B147.java @@ -0,0 +1,120 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * スライムの王 自分以下のスライムを取り込んで一番でかくなる + * + * 問題の入力例2に対しての解決法がわからないため教えて頂けないでしょうか。 + * + * @author kshiraishi + * @version 1 + */ +public class B147 { + + public static class dto { + private int slimeCount; + private int slimeSize; + private List slimeSizeList = new ArrayList<>(); + private int targetSlimeSize = 0; + private int absorbCount = 0; + + + 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 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) { + dto obj = initialize(); //初期化 + + + while ( !(obj.getTargetSlimeSize() == -1) ) { + //自分以上のスライムがいるか判定(いなかったら終了) + if(isBiggerSlime(obj)) { + isSmallerSlime(obj); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) + absorbWeakerSlimes(obj); //自分の大きさ+吸収するスライムの大きさ + }else { + System.out.print(obj.getAbsorbCount()); //取り込んだ回数表示して正常終了 + System.exit(0); + } + } + + } + + + public static B147.dto initialize() { + Scanner sc = new Scanner(System.in); + dto obj = new dto(); + obj.setSlimeCount(sc.nextInt()); + obj.setSlimeSize(sc.nextInt()); + for(int i = 0; i < obj.getSlimeCount(); i++) { + obj.setSlimeSizeList(sc.nextInt()); + } + return obj; + } + + //自分以上のスライムがいたらtrue + public static boolean isBiggerSlime(B147.dto obj) { + for(int i=0; i= obj.getSlimeSizeList().get(i)) { + //見つけたスライムが以前見つけてたスライムより大きい場合更新 + if(obj.getSlimeSizeList().get(i) > maxAbsorbSlimeSize) { + maxAbsorbSlimeSize = obj.getSlimeSizeList().get(i); + } + } + } + //ループ終了後、最終的な取り込み候補の設定 + obj.setTargetSlimeSize(maxAbsorbSlimeSize); + } + + //スライムを取り込む + 取り込み回数+1 + public static void absorbWeakerSlimes(B147.dto obj){ + //取り込めるスライムがいるか + if(obj.getTargetSlimeSize() != -1) { + obj.setSlimeSize(obj.getSlimeSize() + obj.getTargetSlimeSize()); //今の大きさ+取り込むスライムの大きさ + obj.setAbsorbCount(obj.getAbsorbCount() + 1 ); //取り込んだ回数カウントup + } + } + +} -- GitLab From 92b2f69ae3474df1ee007ed64330c61169a2059e Mon Sep 17 00:00:00 2001 From: kshiraishi Date: Mon, 7 Jul 2025 10:29:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?B147=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kshiraishi/src/B147.java | 116 +++++++++++++++++++++++++++++---------- 1 file changed, 87 insertions(+), 29 deletions(-) diff --git a/kshiraishi/src/B147.java b/kshiraishi/src/B147.java index b17782b..4485234 100644 --- a/kshiraishi/src/B147.java +++ b/kshiraishi/src/B147.java @@ -1,25 +1,29 @@ import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Scanner; /** * スライムの王 自分以下のスライムを取り込んで一番でかくなる * - * 問題の入力例2に対しての解決法がわからないため教えて頂けないでしょうか。 + * * * @author kshiraishi * @version 1 */ public class B147 { - public static class dto { + 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; } @@ -36,6 +40,9 @@ public class B147 { return this.absorbCount; } + public void setMaxSlimeSizeInCountry(int maxSlimeSizeInCountry) { + this.maxSlimeSizeInCountry = maxSlimeSizeInCountry; + } public void setSlimeCount(int slimeCount) { this.slimeCount = slimeCount; } @@ -54,62 +61,113 @@ public class B147 { } public static void main(String[] args) { - dto obj = initialize(); //初期化 + SlimeData dto = initialize(); //初期化 + + // 国で一番大きいスライムの大きさを計算し設定 + List allSlimeSizes = new ArrayList<>(dto.getSlimeSizeList()); + allSlimeSizes.add(dto.getSlimeSize()); + //自分を含めて最大サイズの計算 + Collections.sort(allSlimeSizes); + if (!allSlimeSizes.isEmpty()) { + dto.setMaxSlimeSizeInCountry(allSlimeSizes.get(allSlimeSizes.size() - 1)); + } else { + // スライムがいない場合、自分が最大とみなす + dto.setMaxSlimeSizeInCountry(dto.getSlimeSize()); + } + + Collections.sort(dto.getSlimeSizeList(), Collections.reverseOrder()); - while ( !(obj.getTargetSlimeSize() == -1) ) { + // 自分が既に一番大きいスライムの場合 + if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { + System.out.println(0); // 吸収は不要なので-1を出力 + return; // プログラムを終了 + } + + int finalResult = -1; + boolean canBeKing = false; + while ( dto.getSlimeSize() <= dto.getMaxSlimeSizeInCountry() ) { //自分以上のスライムがいるか判定(いなかったら終了) - if(isBiggerSlime(obj)) { - isSmallerSlime(obj); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) - absorbWeakerSlimes(obj); //自分の大きさ+吸収するスライムの大きさ - }else { - System.out.print(obj.getAbsorbCount()); //取り込んだ回数表示して正常終了 - System.exit(0); - } + + updateTargetSlime(dto); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) + if (dto.getTargetSlimeSize() != -1) { + // 吸収できるスライムがいる場合 + absorbWeakerSlimes(dto); // 自分の大きさ+吸収するスライムの大きさ + } else { + // 自身より大きいスライムはいるが、吸収できるスライムがいない場合 + canBeKing = false; // 王になれないと判断 + break; + } + + // ループの途中で王になったかチェック(ここで break することも可能) + if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { + canBeKing = true; + break; + } } + // ループ終了後の最終結果の判定 + if (canBeKing) { + finalResult = dto.getAbsorbCount(); + } else if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { + // ループを抜けた時点で自分が最大のスライムより大きくなっていれば、王になれた + finalResult = dto.getAbsorbCount(); + } else { + // 王になれない場合 (finalResult は -1 のまま) + finalResult = -1; + } + // canBecomeKing が false の場合、finalResult は初期値の -1 のまま + System.out.println(finalResult); + } - } - public static B147.dto initialize() { + + public static B147.SlimeData initialize() { Scanner sc = new Scanner(System.in); - dto obj = new dto(); + SlimeData obj = new SlimeData(); obj.setSlimeCount(sc.nextInt()); obj.setSlimeSize(sc.nextInt()); for(int i = 0; i < obj.getSlimeCount(); i++) { obj.setSlimeSizeList(sc.nextInt()); } + sc.close(); return obj; } + /* //自分以上のスライムがいたらtrue - public static boolean isBiggerSlime(B147.dto obj) { - for(int i=0; i= obj.getSlimeSizeList().get(i)) { - //見つけたスライムが以前見つけてたスライムより大きい場合更新 - if(obj.getSlimeSizeList().get(i) > maxAbsorbSlimeSize) { - maxAbsorbSlimeSize = obj.getSlimeSizeList().get(i); + public static void updateTargetSlime(B147.SlimeData obj) { + int maxAbsorbSlimeSize = -1; // 吸収できる最大のスライムの大きさを保持する変数 + int targetIndex = -1; // 吸収対象のスライムのインデックス + // 自分以下の最も大きいスライムを探す + for (int i = 0; i < obj.getSlimeSizeList().size(); i++) { + if (obj.getSlimeSize() >= obj.getSlimeSizeList().get(i)) { + maxAbsorbSlimeSize = obj.getSlimeSizeList().get(i); + targetIndex = i; + break; } - } } - //ループ終了後、最終的な取り込み候補の設定 + // 見つかったスライムをリストから削除 + if (targetIndex != -1) { + obj.getSlimeSizeList().remove(targetIndex); + } + // 最終的な取り込み候補のサイズを設定 obj.setTargetSlimeSize(maxAbsorbSlimeSize); - } +} //スライムを取り込む + 取り込み回数+1 - public static void absorbWeakerSlimes(B147.dto obj){ + public static void absorbWeakerSlimes(B147.SlimeData obj){ //取り込めるスライムがいるか if(obj.getTargetSlimeSize() != -1) { obj.setSlimeSize(obj.getSlimeSize() + obj.getTargetSlimeSize()); //今の大きさ+取り込むスライムの大きさ -- GitLab From 170ea92113183e494531b6676fa1a1b44ad018b6 Mon Sep 17 00:00:00 2001 From: kshiraishi Date: Mon, 7 Jul 2025 16:30:34 +0900 Subject: [PATCH 3/3] =?UTF-8?q?B147=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kshiraishi/src/B147.java | 82 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/kshiraishi/src/B147.java b/kshiraishi/src/B147.java index 4485234..ea582de 100644 --- a/kshiraishi/src/B147.java +++ b/kshiraishi/src/B147.java @@ -61,60 +61,58 @@ public class B147 { } public static void main(String[] args) { - SlimeData dto = initialize(); //初期化 + SlimeData mySlimeData = initialize(); //初期化 // 国で一番大きいスライムの大きさを計算し設定 - List allSlimeSizes = new ArrayList<>(dto.getSlimeSizeList()); - allSlimeSizes.add(dto.getSlimeSize()); + List allSlimeSizes = new ArrayList<>(mySlimeData.getSlimeSizeList()); + allSlimeSizes.add(mySlimeData.getSlimeSize()); //自分を含めて最大サイズの計算 Collections.sort(allSlimeSizes); if (!allSlimeSizes.isEmpty()) { - dto.setMaxSlimeSizeInCountry(allSlimeSizes.get(allSlimeSizes.size() - 1)); + mySlimeData.setMaxSlimeSizeInCountry(allSlimeSizes.get(allSlimeSizes.size() - 1)); } else { // スライムがいない場合、自分が最大とみなす - dto.setMaxSlimeSizeInCountry(dto.getSlimeSize()); + mySlimeData.setMaxSlimeSizeInCountry(mySlimeData.getSlimeSize()); } - Collections.sort(dto.getSlimeSizeList(), Collections.reverseOrder()); + Collections.sort(mySlimeData.getSlimeSizeList(), Collections.reverseOrder()); // 自分が既に一番大きいスライムの場合 - if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { + if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { System.out.println(0); // 吸収は不要なので-1を出力 return; // プログラムを終了 } int finalResult = -1; - boolean canBeKing = false; - while ( dto.getSlimeSize() <= dto.getMaxSlimeSizeInCountry() ) { + //boolean canBeKing = false; + while ( mySlimeData.getSlimeSize() <= mySlimeData.getMaxSlimeSizeInCountry() ) { //自分以上のスライムがいるか判定(いなかったら終了) - updateTargetSlime(dto); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) - if (dto.getTargetSlimeSize() != -1) { + updateTargetSlime(mySlimeData); //自分以下のスライムがいるか探す。(いなかったらtargetSlimeSize = -1) + if (mySlimeData.getTargetSlimeSize() != -1) { // 吸収できるスライムがいる場合 - absorbWeakerSlimes(dto); // 自分の大きさ+吸収するスライムの大きさ - } else { - // 自身より大きいスライムはいるが、吸収できるスライムがいない場合 - canBeKing = false; // 王になれないと判断 - break; + absorbWeakerSlimes(mySlimeData); // 自分の大きさ+吸収するスライムの大きさ } - // ループの途中で王になったかチェック(ここで break することも可能) - if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { - canBeKing = true; - break; + if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { + // スライム王になっていれば取込回数を出力する + finalResult = mySlimeData.getAbsorbCount(); } + } + /* // ループ終了後の最終結果の判定 if (canBeKing) { - finalResult = dto.getAbsorbCount(); - } else if (dto.getSlimeSize() > dto.getMaxSlimeSizeInCountry()) { + finalResult = mySlimeData.getAbsorbCount(); + } else if (mySlimeData.getSlimeSize() > mySlimeData.getMaxSlimeSizeInCountry()) { // ループを抜けた時点で自分が最大のスライムより大きくなっていれば、王になれた - finalResult = dto.getAbsorbCount(); + finalResult = mySlimeData.getAbsorbCount(); } else { // 王になれない場合 (finalResult は -1 のまま) finalResult = -1; } + */ // canBecomeKing が false の場合、finalResult は初期値の -1 のまま System.out.println(finalResult); } @@ -124,21 +122,21 @@ public class B147 { public static B147.SlimeData initialize() { Scanner sc = new Scanner(System.in); - SlimeData obj = new SlimeData(); - obj.setSlimeCount(sc.nextInt()); - obj.setSlimeSize(sc.nextInt()); - for(int i = 0; i < obj.getSlimeCount(); i++) { - obj.setSlimeSizeList(sc.nextInt()); + 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 obj; + return gemeState; } /* //自分以上のスライムがいたらtrue - public static boolean isBiggerSlime(B147.SlimeData obj) { - for(int i=0; i= obj.getSlimeSizeList().get(i)) { - maxAbsorbSlimeSize = obj.getSlimeSizeList().get(i); + for (int i = 0; i < gemeState.getSlimeSizeList().size(); i++) { + if (gemeState.getSlimeSize() >= gemeState.getSlimeSizeList().get(i)) { + maxAbsorbSlimeSize = gemeState.getSlimeSizeList().get(i); targetIndex = i; break; } } // 見つかったスライムをリストから削除 if (targetIndex != -1) { - obj.getSlimeSizeList().remove(targetIndex); + gemeState.getSlimeSizeList().remove(targetIndex); } // 最終的な取り込み候補のサイズを設定 - obj.setTargetSlimeSize(maxAbsorbSlimeSize); + gemeState.setTargetSlimeSize(maxAbsorbSlimeSize); } //スライムを取り込む + 取り込み回数+1 - public static void absorbWeakerSlimes(B147.SlimeData obj){ + public static void absorbWeakerSlimes(B147.SlimeData gemeState){ //取り込めるスライムがいるか - if(obj.getTargetSlimeSize() != -1) { - obj.setSlimeSize(obj.getSlimeSize() + obj.getTargetSlimeSize()); //今の大きさ+取り込むスライムの大きさ - obj.setAbsorbCount(obj.getAbsorbCount() + 1 ); //取り込んだ回数カウントup + if(gemeState.getTargetSlimeSize() != -1) { + gemeState.setSlimeSize(gemeState.getSlimeSize() + gemeState.getTargetSlimeSize()); //今の大きさ+取り込むスライムの大きさ + gemeState.setAbsorbCount(gemeState.getAbsorbCount() + 1 ); //取り込んだ回数カウントup } } -- GitLab