日常训练2025-1-5
日常训练2025-1-5
L. Bridge Renovation
rating:1400
思路(贪心)
需要思考每种板子的组合方式,最好的组合方式是两个2号板子和1个1号板子,加起来只消耗一块板子。
其次是三块1号板子加起来只消耗一块板子。
然后就是两块任意板子需要消耗一块板子。
代码
#include <bits/stdc++.h>
typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;
void solve(){
int n;
std::cin >> n;
if (n == 1){
std::cout << 2 << '\n';
return;
}
int ans = 0;
int a = n, b = n, c = n;
if (b % 2 == 0){
ans += b / 2;
a -= b / 2;
b = 0;
}else{
ans += b / 2;
a -= b / 2;
b = 1;
if (a >= 2){
ans += 1;
a -= 2;
b = 0;
}
}
if (a != 0){
if (a % 3 == 1){
ans += a / 3;
ans += 1;
c -= 1;
a = 0;
}else if (a % 3 == 2){
ans += a / 3;
ans += 1;
a = 0;
}else if (a % 3 == 0){
ans += a / 3;
a = 0;
}
}
ans += c / 2;
ans += c % 2 == 0 ? 0 : 1;
std::cout << ans << '\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
int t = 1, i;
for (i = 0; i < t; i++){
solve();
}
return 0;
}
E. Three Strings
rating:1500
https://codeforces.com/contest/2050/problem/E
思路
注意到本题是求最小化问题,其次就是数据范围并不大,所以可以往DP方面想,恰好本题就是DP
状态定义:\(f[i][j]\):表示 a 用了 1 ~ i 个字符,b 用了 1 ~ j 个字符,得到的最小替换数
状态转移:\(f[i][j] + (a[i+1] \neq c[i+j+1]) \rightarrow f[i+1][j]\)
\(f[i][j] + (b[j+1] \neq c[i+1 +1]) \rightarrow f[i][j+1]\)
评述
做的时候其实想到DP了,但是不是特别坚定,总感觉还有其他解法,结果状态定义没想出来。
代码
#include <bits/stdc++.h>
typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;
void solve(){
std::string a, b, c;
std::cin >> a >> b >> c;
a = ' ' + a, b = ' ' + b, c = ' ' + c;
std::vector<std::vector<int>> dp(a.size(), std::vector<int>(b.size(), INF));
dp[0][0] = 0;
for (int i = 0; i < a.size(); i++){
for (int j = 0; j < b.size(); j++){
if (i+1 < a.size()) dp[i+1][j] = std::min(dp[i+1][j], dp[i][j] + (a[i+1] != c[i+1+j]));
if (j+1 < b.size()) dp[i][j+1] = std::min(dp[i][j+1], dp[i][j] + (b[j+1] != c[i+1+j]));
}
}
std::cout << dp[a.size() - 1][b.size() - 1] << '\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
int t = 1, i;
std::cin >> t;
for (i = 0; i < t; i++){
solve();
}
return 0;
}

浙公网安备 33010602011771号