Codeforces Round #821 (Div. 2) 题解
题目列表
A.Consecutive Sum
int a[N];
void solve() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
a[i % k] = max(a[i % k], x);
}
ll ans = 0;
for (int i = 0; i < k; ++i) {
ans += a[i];
a[i] = 0;
}
cout << ans << endl;
}
B.Rule of League
int a[N];
void solve() {
int n, x, y, xx, yy;
cin >> n >> xx >> yy;
x = min(xx, yy), y = max(xx, yy);
if (x != 0 || y == 0 || (n - 1) % y != 0) {
cout << -1 << endl;
return;
}
int cur = -1, last = 1;
bool ok = 0;
for (int i = 0; i < n - 1; ++i) {
if (i == 0) {
cout << last << " ";
continue;
}
if ((i % y == 0) && ok) {
last += y;
} else if ((i % y == 0) && !ok) {
last += y + 1;
ok = 1;
}
cout << last << " ";
}
cout << endl;
}
C.Parity Shuffle Sorting
ll a[N];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
if (n == 1) {
cout << 0 << endl;
return;
}
cout << n - 1 << endl;
cout << 1 << " " << n << endl;
if (((a[1] + a[n]) & 1) == 0) {
a[1] = a[n];
}
for (int i = 2; i < n; ++i) {
if ((a[1] + a[i]) & 1) {
cout << 1 << " " << i << endl;
} else {
cout << i << " " << n << endl;
}
}
}
D1.Zero-One (Easy Version)
void solve() {
string s1, s2;
ll n, x, y;
cin >> n >> x >> y;
cin >> s1 >> s2;
vector v;
for (int i = 0; i < n; ++i) {
if (s1[i] != s2[i]) {
v.push_back(i);
}
}
if (v.size() & 1) {
cout << -1 << endl;
return;
}
if ((v.size() == 2) && (v[0] == (v[1] - 1))) {
cout << min(x, 2 * y) << endl;
return;
}
cout << y * (v.size() / 2) << endl;
}
D2.Zero-One (Hard Version)
因为串的长度只\(5000\),可以考虑区间DP
定义$ dp[i][j]$表示 \(s1[i,j]\) 变成 \(s2[i,j]\) 的最小花费
\(cnt\)表示两串不相同的位置的个数
\(gao(a,b)\)用于计算选取了\(a,b\)两个位置进行操作的代价
\({dp[i][j]=min( dp[i][j-2]+gao(j-1,j),dp(i+1,j-1)+gao(i,j),dp(i+2,j)+gao(i,i+1),cnt/2*y)}\)
ll dp[5010][5010]; vectorv; ll n,x,y; string s1,s2; ll gao(ll a,ll b) { int dis = abs(v[a] - v[b]); if (dis == 1) { return min(x, y * 2); } else { return min(dis * x, y); } } void solve() { // memset(dp,inf,sizeof dp); int cnt = 0; cin >> n >> x >> y; cin >> s1 >> s2; v.clear(); for (int i = 0; i < n; ++i) { if (s1[i] != s2[i]) { v.push_back(i); cnt++; } } if (cnt & 1) { cout << -1 << endl; return; } for (int k = 2; k <= cnt; k += 2) { for (int l = 0; l + k - 1 < cnt; ++l) { int r = l + k - 1; if (k == 2) { dp[l][r] = gao(l, r); } else { dp[l][r] = min( min(dp[l + 1][r - 1] + gao(l, r), dp[l + 2][r] + gao(l, l + 1)), min(dp[l][r - 2] + gao(r - 1, r), ll(cnt / 2) * y)); } } } cout << dp[0][cnt - 1] << endl; }
E. Conveyor
ll t,x,y;
ll f[150][150];
int calc(ll t,ll x, ll y) {
memset(f, 0, sizeof f);
f[0][0] = max(0ll,t - x - y + 1) ;
for (int i = 0; i <= 130; ++i) {
for (int j = 0; j <=130;++j) {
f[i][j + 1] += (f[i][j] + 1) / 2;
f[i + 1][j] += f[i][j] / 2;
}
}
// dbg(f[x][y]);
return f[x][y];
}
void solve() {
cin >> t >> x >> y;
if (t == 0 && x == 0 && y == 0) {
cout << "YES" << endl;
return;
}
if (t == 0) {
cout << "NO" << endl;
return;
}
if (x + y > t) {
cout << "NO" << endl;
return;
}
if (calc(t, x, y) <= calc(t - 1, x, y)) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
}
}

浙公网安备 33010602011771号