A問題
問題を読み解くと、$A + B$ がコンテスト開催時間になるとわかります。
基本的には、それを出力すればよいですが、開催が翌日になることがあるので、$A + B$ を 24 で割ったあまりを出力します。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int a, b;
cin >> a >> b;
cout << (a + b) % 24 << endl;
}
B問題
各学生にとって、どのチェックポイントが一番近いかを全探索します。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int n, m;
cin >> n >> m;
int a[n], b[n], c[m], d[m];
for(int i = 0; i < n; i++) cin >> a[i] >> b[i];
for(int i = 0; i < m; i++) cin >> c[i] >> d[i];
int ans;
for(int i = 0; i < n; i++){ //全生徒について試す
int point = 1e9; //最短距離を記録する
for(int j = 0; j < m; j++){ //全チェックポイントについて試す
//マンハッタン距離を求める
int dis = abs(a[i] - c[j]) + abs(b[i] - d[j]);
if(dis < point){ //距離が一番近いなら
point = dis; //距離を更新する
ans = j + 1; //チェックポイントの番号を記録する
}
}
cout << ans << endl;
}
}
C問題
まず、$A, B$ の桁数を求めるには、$A, B$ を文字列にして、その長さを確かめればよいです。
そして、$A, B$ の桁数の大きい方が $F(A, B)$ になります。
$N = A \times B = B \times A$ が成り立つので、$1 \leqq A \leqq \sqrt N$ を満たす $A$ を全て試して、最小の $F(A, B)$ を出力すればよいです。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int digit(int x){ //桁数を返す関数
return (int)to_string(x).size();
}
int main(void){
long long n;
cin >> n;
int ans = 1e9;
for(int i = 1; i <= sqrt(n); i++){
if(n % i == 0){
int a = digit(i), b = digit(n / i);
// A, B の桁数を求める
int f = max(a, b);
//
ans = min(ans, f);
}
}
cout << ans << endl;
}
D問題