はじめに
自分用の備忘録です。
問題文
下記のリンクを参考にしてください。1からNまで全部足そう!でも、このリストの中にある数は足さないでね!っていう問題です。
解答例
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int k = scanner.nextInt(); TreeSet<Integer> st = new TreeSet<>(); for (int i = 0; i < n; i++) { int a = scanner.nextInt(); if (a <= k) st.add(a); } long ans = (long) k * (k + 1) / 2; for (int i: st) ans -= i; System.out.println(ans); } }
その2
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); Set<Integer> set = new HashSet<>(); for (int i = 0; i < N; i++) { int a = sc.nextInt(); if (a <= K) { set.add(a); } } long ans = (long) K * (K + 1) / 2; for (Integer integer : set) { ans -= integer; } System.out.println(ans); } }
メモ
なんか、JDKとかVScodeがうまく動いていなさそうだなって思ったら一回、アプリを消そう。なんかなおる。
{ (初めの数) + (終わりの数) }× (個数) ÷2
これで、ある数からある数までの連続している合計値が分かる。面積でこの問題を考えると分かりやすい。高さが1からNまでの階段ができて、それをひっくり返したやつを足しちゃう。それを2分の1しちゃったらなんか、何とかなっちゃった的な。(説明雑だな。笑)