公式の解説を見る前に記述しています。
先に補足
自作のテンプレートを更新したので載せておきます
# include <bits/stdc++.h>
# define INF 2e9
# define REP(i,n) for(int i = 0; i < n;++i)
# define REPA(i,a,n) for(int i = a; i < n; ++i)
# define REPR(i,a) for(int i = a; i >= 0; --i)
# define ALL(a) a.begin(), a.end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector< vector<int> > vvi;
int gcd(int a, int b){ return b ? gcd(b, a % b) : a; }
template<typename A> void psn(A a){ cout << a << endl; }
template<typename A, typename... B> void psn(A a, B... b){ cout << a << ' '; psn(b...); }
int main(void) {
return 0;
}
psnは"print space ¥n"
ようはスペース区切り行末改行の略です。
AtCoder Beginner Contest 144
A - 9x9
int main(void) {
int A, B;
cin >> A >> B;
if(A < 10 && B < 10) psn(A * B);
else psn(-1);
return 0;
}
ABが10以下の数字ならそのまま掛け算し、それ以外なら−1の分岐をすれば良い
B - 81
int main() {
int N;
cin >> N;
REP(i, 9){
REPA(j, i, 9){
if((i + 1) * (j + 1) == N) {
psn("Yes");
return 0;
}
}
}
psn("No");
return 0;
}
九九に出てくる数字を全部出して与えられた数と同じ数があるかを調べる。
うまいやり方がないか少しだけ悩んだけど全探索で間に合うなら全探索すればいいやって感じ
C - Walk on Multiplication Table
int main() {
ll N, min = 1000000000001;
cin >> N;
double times = sqrt(N);
for(ll i = 1; i < 1000001; i++){
if(N % i == 0){
if(min > i + (ll)(N / i) - 2){
min = i + (ll)(N / i) - 2;
}
}
}
psn(min);
return 0;
}
合成数Nは√N以下の約数を必ず持つので、
√N以下の値で全て割ってみて割り切れたマスの座標の中で一番近い場所の座標を調べる
一番近いかどうか=(a, b)のマスに到達するのにかかる歩数=(a-1)+(b-1)回で比較
計算量は_O(√N)_で最大10^6くらいなのでまあ間に合う
D - Water Bottle
問題
普通の数学の問題を出すな。俺は数学ができない。
int main() {
int a, b, x;
cin >> a >> b >> x;
double h = x / (a * a); // 水が溜まっている高さ
double r = 45.0;
double beta;
if(b / 2 >= h){ // 半分か少ない
beta = (b * 2) - (h * 2); // 現在の高さが半分の筒に延長する
}
double l = (x * 2) / sqrt(a * a + b * b);
double t = sqrt(l * l - beta * beta);
double cosl = (t * t + beta * beta - l * l) / (2 * l * t);
psn(l, t, beta, cosl); // デバッグ文
// 解けませんでした
return 0;
}
水面が常に平行なことと入っている水の量は変わらないので体積は変わらないことから溢れる瞬間の注ぎ口(?)の高さを計算し求めたい角度を含む三角形の辺の長さが全てわかるので三角比が求まりあとは二分法でその三角比になる各θを求めればOK水が半分以下の時はその高さが筒の真ん中になるように筒を延長して...
とか必死に図に書いたメモを失くしたので現場からは以上です。