AtCoder ABC 103 A&B&C
A問題
- 配列に格納してソート
- ソートした順に作業
private void solveA() {
Scanner scanner = null;
try {
scanner = new Scanner(System.in);
int[] wk = new int[3];
for (int i = 0; i < wk.length; i++) {
wk[i] = scanner.nextInt();
}
Arrays.sort(wk);
int res = Math.abs(wk[0] - wk[1]) + Math.abs(wk[1] - wk[2]);
System.out.println(res);
} finally {
if (scanner != null) {
scanner.close();
}
}
}
B問題
-
kyotoという文字列の最後の文字を最初に持っていって循環させる
- kyoto
- okyot
- tokyo
- .....
- tokyo
- okyot
- kyoto
-
一文字ずつ判定しても何とかなるけど、、、
- 文字列Tは文字列Sの長さを超えることはないので、
kyoto+kyoto=kyotokyoto
としてしまってkyotokyoto
のなかに文字列Tが含まれるのかを判定するのが早い
- 文字列Tは文字列Sの長さを超えることはないので、
private void solveB() {
Scanner scanner = null;
String s;
String t;
try {
scanner = new Scanner(System.in);
s = scanner.next();
t = scanner.next();
s = s + s;
System.out.println(s.contains(t) ? "Yes" : "No");
} finally {
if (scanner != null) {
scanner.close();
}
}
}
C問題
$f(m) ; =; (m ; mod ; a_1) ; + ; (m ; mod ; a_2) ; +...+ ; (m ; mod ; a_N)$
-
$f(m)$ を最大化したい
- 細かく見ると
- $(m ; mod ; a_i) $ の最小は $(m ; mod ; a_i) =0$
- $(m ; mod ; a_i) $ の最大は $(m ; mod ; a_i) =a_i-1$ <- $a_i$の余りなので
- $f(m)$ を最大化するには、 $(m ; mod ; a_i) $ が最大化できればよい
- 細かく見ると
-
$m = a_1 × a_2 × · · · × a_N$ とすると、各 i について $(m ; mod ; a_i = 0)$ なので、$((m − 1) ; mod ; a_i = a_i − 1)$
- $(N*A ; mod ; A)$ は $N$ によらず $0$ ...
-
$f(m − 1) = (a_1 − 1) + (a_2 − 1) + ...... + (a_n − 1)$ となり、各項が最大値を取っている
private void solveC() {
Scanner scanner = null;
int numN = 0;
try {
scanner = new Scanner(System.in);
numN = scanner.nextInt();
int[] wk = new int[numN];
int res = 0;
for (int i = 0; i < wk.length; i++) {
wk[i] = scanner.nextInt();
res += wk[i] - 1;
}
System.out.println(res);
} finally {
if (scanner != null) {
scanner.close();
}
}
}