日常训练2025-1-5

日常训练2025-1-5

L. Bridge Renovation

rating:1400

https://codeforces.com/problemset/problem/2038/L

思路(贪心)

需要思考每种板子的组合方式,最好的组合方式是两个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]c[i+j+1])f[i+1][j]

f[i][j]+(b[j+1]c[i+1+1])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;
}

本文作者:califeee

本文链接:https://www.cnblogs.com/califeee/p/18653285

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   califeee  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.