How E
  • 板块学术版
  • 楼主Walrus
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/3/16 21:45
  • 上次更新2024/3/16 23:24:51
查看原帖
How E
908424
Walrus楼主2024/3/16 21:45

目前思路感觉有点问题。

大概是贪心+背包。

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int M = 2e5 + 5;
int c[M], v[M], n, k, ans;
int C[M], V[M];
int dp[505];

int l[M], r[M], sum[M], tot = 1;
int N;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> n >> k;
	for(int i = 1; i <= n; ++i)
		cin >> c[i] >> v[i], sum[i] = sum[i - 1] + v[i];
	
	l[1] = 1, r[1] = 1;
	for(int i = 2; i <= n; ++i) {
		if(c[i] == c[i - 1])
			++r[tot];
		else
			l[++tot] = i, r[tot] = i;
	}
	
	r[tot] = n;
	
		
	
	for(int i = 1; i <= tot; ++i) {
		if(r[i] - l[i] + 1 > 1) {
			V[++N] = r[i] - l[i], C[N] = sum[r[i] - 1] - sum[l[i]] + min(v[r[i]], v[l[i]]);
		}
	}
	
	if(N == 0) {
		sort(v + 1, v + 1 + n);
		for(int i = 1; i <= k; ++i)	
			ans += v[i];
		cout << sum[n] - ans;
		return 0;
	}
	
//	for(int i = 1; i <= N; ++i)
//		cout << V[i] << ' ' << C[i] <<'\n';
	
	
	memset(dp, 0x3f, sizeof dp), dp[0] = 0;
	for(int i = 1; i <= N; ++i) {
		for(int j = k; j >= V[i]; --j)
			dp[j] = min(dp[j], dp[j - V[i]] + C[i]);
	}
	if(dp[k] > 1e9)
		return cout << -1, 0;
	cout << sum[n] - dp[k];
	return 0;
}

WA 10

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int M = 2e5 + 5;
int c[M], v[M], n, k, ans;
int C[M], V[M];
int dp[505];

int l[M], r[M], id[M], sum[M], tot = 1;
int N;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> n >> k;
	for(int i = 1; i <= n; ++i)
		cin >> c[i] >> v[i], sum[i] = sum[i - 1] + v[i];
	
	l[1] = 1, r[1] = 1, id[1] = c[1];
	for(int i = 2; i <= n; ++i) {
		if(c[i] == c[i - 1])
			++r[tot];
		else
			l[++tot] = i, r[tot] = i, id[tot] = c[i];
	}
	
	r[tot] = n;
	
		
	
	for(int i = 1; i <= tot; ++i) {
		if(r[i] - l[i] + 1 > 1) {
			V[++N] = r[i] - l[i], C[N] = sum[r[i] - 1] - sum[l[i]] + min(v[r[i]], v[l[i]]);
		}
		if(1 < i && i < tot && id[i - 1] == id[i + 1])
			V[++N] = r[i + 1] - l[i - 1], C[N] = sum[r[i + 1] - 1] - sum[l[i - 1]] + min(v[r[i + 1]], v[l[i - 1]]);
		else if(id[i - 1] != id[i + 1])
			V[++N] = r[i] - l[i] + 1, C[N] = sum[r[i]] - sum[l[i] - 1];
	}
	
//	if(N == 0) {
//		sort(v + 1, v + 1 + n);
//		for(int i = 1; i <= k; ++i)	
//			ans += v[i];
//		cout << sum[n] - ans;
//		return 0;
//	}
	
//	for(int i = 1; i <= N; ++i)
//		cout << V[i] << ' ' << C[i] <<'\n';
	
	
	memset(dp, 0x3f, sizeof dp), dp[0] = 0;
	for(int i = 1; i <= N; ++i) {
		for(int j = k; j >= V[i]; --j)
			dp[j] = min(dp[j], dp[j - V[i]] + C[i]);
	}
	if(dp[k] > 1e9)
		return cout << -1, 0;
	cout << sum[n] - dp[k];
	return 0;
}

乱搞 WA 17

2024/3/16 21:45
加载中...