CF
Problem - 1787C - Codeforces(dp好题)
题意:对于 \(a_2,a_3…a_{n−1}\),求出 \(x_i\) 和 \(y_i\),满足 \(x_i+y_i=a_i\) 且 \((x_i−s)(y_i−s)≥0\),并使得:
\(F=a_1×x_2+y_2×x_3+y_3×⋯×x_{n−1}+y_n−1×a_n\)
对于\(x_i,y_i\),分上下界讨论
\(dp_{i,0/1}\) :表示前 \(i\) 个,第\(i\) 个取下界或者上界的最小值
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL mod = 998244353;
const int N=2e5+10;
LL a[N], dp[N][2],mx[N],mn[N];void solve()
{int n, s;cin >> n >> s;for (int i = 0; i < n;i++){cin >> a[i];if(a[i]>=2*s)mn[i] = s, mx[i] = a[i] - s;elsemn[i] = max(0LL,a[i] - s),mx[i]=a[i]-mn[i];}dp[1][0] = a[0] * mn[1];dp[1][1] = a[0] * mx[1];for (int i = 2; i < n-1;i++){dp[i][0] = min(dp[i - 1][0] + mx[i - 1] * mn[i], dp[i - 1][1] + mn[i - 1] * mn[i]);dp[i][1] = min(dp[i - 1][0] + mx[i - 1] * mx[i], dp[i - 1][1] + mn[i - 1] * mx[i]);}cout << min(dp[n - 2][0] + mx[n - 2] * a[n - 1], dp[n - 2][1] + mn[n - 2] * a[n - 1]) << endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin >> T;while (T--){solve();}
}
Problem - 1848B - Codeforces
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL mod = 998244353;
const int N=2e5+10;
vector<int> a[N];void solve()
{int n, k;cin >> n >> k;for (int i = 0; i <= k;i++){a[i].clear();a[i].push_back(0);}for (int i = 1; i <= n;i++){int x;cin >> x;a[x].push_back(i);}int ans = n + 1;for (int i = 1; i <= k;i++){a[i].push_back(n + 1);int mx1 = 0, mx2 = 0;for (int j = 1; j < (int)a[i].size();j++){int x = a[i][j] - a[i][j - 1];if(x>mx1)swap(x, mx1);if(x>mx2)swap(x, mx2);}mx2 = max(mx2, (mx1 + 1) / 2);ans = min(ans, mx2);}cout << ans - 1 << endl;//求的是空白距离,所以-1
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin >> T;while (T--){solve();}
}