日常训练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] \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;
}
posted @ 2025-01-05 13:21  califeee  阅读(25)  评论(0)    收藏  举报