您的位置:首页 > 其它

Codeforces 637D Running with Obstacles 【贪心】

2016-03-19 11:24 411 查看
题目链接:Codeforces 637D Running with Obstacles

题意:在一条路上有n个障碍物,障碍物只能跳过。每次你可以走至少s米,最多跳d米。问你可不可以从0到达m,输出一种方案,要求走和跳严格交替。 PS:从最后一个障碍物到终点,允许走任意长度。

思路:贪心,始终跳到障碍物后面一米。然后用一个数组距离下就好了。

每次由两种决策:

1、从障碍物前面一米跳到它后面一米,然后走到下一个障碍物前一米;

2、从障碍物前面一米跳到后面某个障碍物后面一米。

决策2是在决策1失败的前提下。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 2*1e5 + 10;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e7+10;
int a[MAXN], dp
[2];
int main()
{
int n, m, s, d;
cin >> n >> m >> s >> d;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
a[0] = 0; a[n+1] = m; CLR(dp, 0); sort(a, a+n+2);
int cnt = 0, i = 1;
for(i = 1; i <= n; i++) {
int dis = a[i] - a[i-1];
if(i == 1) {
if(dis <= s) break;
else {
dp[cnt][0] = 1;
dp[cnt++][1] = dis - 1;
}
}
else {
if(dis - 2 >= s) {
if(d < 2) break;
if(cnt & 1) {
dp[cnt++][1] = 2;
}
dp[cnt][0] = 1;
dp[cnt++][1] = dis - 2;
}
else {
int go = a[i-1] - 1 + d;
bool flag = false;
int p = i-1;
for(; i <= n; i++) {
dis = a[i+1] - a[i] - 2;
if(i == n) {
dis++;
if(dis > 0 && a[i] + 1 <= go) {
flag = true;
break;
}
}
else if(dis >= s && a[i] + 1 <= go) {
flag = true;
break;
}
}
if(!flag) {
i = 0; break;
}
dp[cnt++][1] = a[i] + 1 - a[p] + 1;
}
}
}
bool yes = false;
if(i == n+1) {
if(d >= 2) {
if(cnt & 1) {
dp[cnt++][1] = 2;
}
if(m - a
- 1 > 0) {
dp[cnt][0] = 1; dp[cnt++][1] = m - a
- 1;
}
yes  = true;
}
}
if(!yes) cout << "IMPOSSIBLE\n";
else {
for(int j = 0; j < cnt; j++) {
if(dp[j][0] == 1) {
cout << "RUN " << dp[j][1] << endl;
}
else {
cout << "JUMP " << dp[j][1] << endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: