ABC267に参加しました
今回はA, B, Cの3完でした。
A:2分
B:19分
C:45分
レート変動
290→331(パフォーマンス:657)
A問題-Saturday
ごり押し
int main() {
string s;
cin >> s;
if (s == "Monday") cout << 5;
else if (s == "Tuesday") cout << 4;
else if (s == "Wednesday") cout << 3;
else if (s == "Thursday") cout << 2;
else cout << 1;
cout << endl;
return 0;
}
B問題-Split?
A問題と同様にベタ書きしました
int main() {
string s;
cin >> s;
vector<bool> retsu(7, false);
if (s[6] == '0') retsu[0] = true;
if (s[3] == '0') retsu[1] = true;
if (s[7] == '0' && s[1] == '0') retsu[2] = true;
if (s[4] == '0' && s[0] == '0') retsu[3] = true;
if (s[8] == '0' && s[2] == '0') retsu[4] = true;
if (s[5] == '0') retsu[5] = true;
if (s[9] == '0') retsu[6] = true;
if (s[0] == '1') {
cout << "No" << endl;
return 0;
}
else {
rep(i, 5) {
if (retsu[i] == false && retsu[i + 1] == true) {
rep3(j, i + 2, 7) {
if (retsu[j] == false) {
cout << "Yes" << endl;
return 0;
}
}
}
}
}
cout << "No" << endl;
return 0;
}
C問題-Index × A(Continuous ver.)
b[i]を計算後の連続部分数列の和としてO(n)でそれらを求められるような実装にした。
int main() {
long long n, m;
cin >> n >> m;
long long res = -1000000000000000000;
vector<long long> a(n);
vector<long long> b(n, -1000000000000000000);
vector<long long> c(n, -1000000000000000000);
rep(i, n) cin >> a[i];
b[0] = 0;
c[0] = 0;
rep(i, m) b[0] += a[i] * (i + 1);
rep(i, m) c[0] += a[i];
rep(i, n - m) c[i + 1] = c[i] + a[i + m] - a[i];
res = b[0];
rep(i, n - m) {
b[i + 1] = b[i] + a[i + m] * m - c[i];
res = max(res, b[i + 1]);
}
cout << res << endl;
return 0;
}
D問題-Index × A(Not Continuous ver.)
dpのDとはコンテスト中には気づかなかった...
int main() {
long long n, m, A;
cin >> n >> m;
long long res = -1000000000000000000;
vector<long long> a(n + 1);
vector<vector<long long>> dp(n + 1, vector<long long>(m + 1, -1000000000000000000));
rep3(i, 1, n + 1) cin >> a[i];
rep3(i, 1, n + 1) {
dp[i][0] = 0;
dp[i][1] = a[i];
}
rep3(i, 2, n + 1) {
rep3(j, 1, i + 1) {
if (j == m + 1) break;
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + a[i] * j);
}
}
rep3(i, m, n + 1) {
res = max(res, dp[i][m]);
}
cout << res << endl;
return 0;
}