求助 CF1341E
  • 板块学术版
  • 楼主juicyyou
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/4/28 20:36
  • 上次更新2023/11/7 03:44:38
查看原帖
求助 CF1341E
177999
juicyyou楼主2020/4/28 20:36

题目: CF13451

洛谷还没更新。

感觉已经和别人的AC代码调得很像了。。。

WA on #3

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#include<set>
#include<cstdlib>
#include<cctype>
#include<ctime>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll maxn = 1e4 + 5;
const ll maxm = 1e3 + 5;
template<class T>
inline T qread(T &IEE){
	register T x = 0, f = 1;
	register char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-'){
			f = -f;
		}
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return IEE = x * f;
}
template<class T>
inline void qwrite(T a){
	if(!a){
		putchar('0');
		return ;
	}
 	if(a < 0){
		putchar('-');
		a = -a;
	}
	if(a > 9) qwrite(a / 10);
	putchar(a % 10 + 48);
	return ;
}
template<class T>
inline T ab(T a){
	return (a > 0) ? a : -a;
}
template<class T>
inline void swa(T &a, T &b){
	a ^= b ^= a ^= b;
	return ;
}
ll ans, v, tmp, dis, u, r, g, m, n;
ll a[maxn];
ll dp[maxn][maxm];
struct node{
	ll id, val;
	node(ll dd = 0, ll vv = 0){
		id = dd;
		val = vv;
	}
};
queue<node> q;
int main(){
//	freopen("1.in", "r", stdin);
//	freopen("1.out", "w", stdout);
	cin >> n >> m;
	for(int i = 1;i <= m;i++){
		cin >> a[i];
	}
	cin >> g >> r;
//	qread(g);
//	qread(r);
	sort(a + 1, a + m + 1);
	memset(dp, -1, sizeof(dp));
	q.push(node(1, 0));
	dp[1][0] = 0;
	ans = 0x3f3f3f3f;
	while(!q.empty()){
		node fr = q.front();
		q.pop();
		v = fr.val, u = fr.id;
		if(u == m){
			if(v == 0){
				ans = min(ans, dp[m][v] * (g + r) - r);
			} else {
				ans = min(ans, dp[m][v] * (g + r) + v);
			}
			continue;
		}
		dis = a[u + 1] - a[u];
		if(v + dis < g && dp[u + 1][v + dis] == -1){
			dp[u + 1][v + dis] = dp[u][v];
			q.push(node(u + 1, v + dis));
		} 
		if(v + dis == g && dp[u + 1][0] == -1){
			dp[u + 1][0] = dp[u][v] + 1;
			q.push(node(u + 1, 0));
		}
		if(u >= 1){
			dis = a[u] - a[u - 1];
			if(v + dis < g && dp[u - 1][v + dis] == -1){
				dp[u - 1][v + dis] = dp[u][v];
				q.push(node(u - 1, v + dis));
			} 
			if(v + dis == g && dp[u - 1][0] == -1){
				dp[u - 1][0] = dp[u][v] + 1;
				q.push(node(u - 1, 0));
			}
		}
	}
	if(ans == 0x3f3f3f3f){
		puts("-1");
		return 0;
	}
	cout << ans << endl;
	return 0;
}
2020/4/28 20:36
加载中...