AtCoder ABC121
3完。
A
数学苦手だから5分もかかってしまった。
signed main() {
int H, W, h, w;
cin >> H >> W >> h >> w;
int white = (H-h) * (W-w);
cout << white << endl;
}
B
各行ごとに計算していく。考察よりもコード書く方に時間を取られた。
signed main() {
int N, M, C;
cin >> N >> M >> C;
vector<int> bs(M);
for (auto &b : bs) {
cin >> b;
}
vector<vector<int>> as(N, vector<int>(M));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> as[i][j];
}
}
int ans = 0;
for (int i = 0; i < N; i++) {
int sum = 0;
for (int j = 0; j < M; j++) {
sum += as[i][j] * bs[j];
}
if (sum + C > 0) {
ans++;
}
}
cout << ans << endl;
}
C
価格の安い順にソートし、貪欲に本数を稼いでいく。
#define int long long // 競プロ以外で使っちゃいけない
typedef pair<int,int> P;
signed main() {
int N, M;
cin >> N >> M;
vector<P> vs(N);
for (int i = 0; i < N; i++) {
int a, b;
cin >> a >> b;
vs[i].first = a, vs[i].second = b;
}
sort(vs.begin(), vs.end(), [](P x, P y) {
return x.first < y.first;
});
int cost = 0, cur = 0;
for (int i = 0; i < N; i++) {
cost += vs[i].first * vs[i].second;
cur += vs[i].second;
if (cur > M) {
int tmp = abs(cur - M);
cost -= vs[i].first * tmp;
break;
}
}
cout << cost << endl;
}
D
気づいたことは以下の法則(あってんのかは知らん)
- f(2^n, 2^(n+1) - 1) = 0
- f(2^n, 2^(n+1)) = 2^(n+1)
- f(2^n + 1, 2^(n+1) - 1) = 2^n
これらを再帰かなんかでこねくり回せばいけそうな気がしたが、そこから先がなんもわからん。
所感
なんか30分以内で3完した程度じゃ、たいしてレートが伸びなくなってきてるな。これはいよいよ本格的にD問題を演習していくべき時期なのだろう。
いや、マジで?今のところの本番でのC問題の打率はそこそこだが、過去問では結構解説ACの量の方が多いんですけど。