Live2D

Kitesurfing 题解

link

Solution

我,tr,废物。

不难看出的是,我们可以通过移动我们的游泳和小跳,使得我们游泳或小跳要么直接到一个岛屿的左端点(中间不能跳),要么先游泳或小跳再跳大跳到一个岛屿的右端点。然后我们可以直接进行dp了。

虽然说得很轻巧,不过实现起来需要智力,然而我没有。我们考虑到岛屿的左端点,这个我们可以直接对于一个状态枚举它后面的一个岛屿进行转移。对于跳到岛屿的右端点的情况,我们可以直接枚举中转点和岛屿。

实现的时候为了方便,所以我们直接跳大跳跳过一个岛的情况也加进状态就好了,用map存状态比较好处理。

复杂度:\(\Theta(?)\),状态数:\(\Theta(?)\)

Code

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

#define Int register int
#define int long long
#define MAXN 505

template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}

int S,D,T,n;

struct node{
	int l,r;
}s[MAXN];

map <int,int> mp;

signed main(){
	read (S,D,T,n);
	for (Int i = 1;i <= n;++ i) read (s[i].l,s[i].r);
	mp[0] = 0;int ans = 1e18;
	while (!mp.empty()){
		auto it = mp.begin();mp.erase (it);
		int x = it -> first,v = it -> second;
		if (x >= s[n].r){
			if (x > S) x = S;
			chkmin (ans,v + (S - x) / D * min (T,D) + min ((S - x) % D,T));
			continue;
		}
		for (Int i = 1;i <= n;++ i) if (s[i].l >= x){
			int cnt = (s[i].l - x) / D + 1,pos = 0,ed = x + cnt * D;
			for (Int j = 1;j <= n;++ j) if (s[j].l < ed && ed < s[j].r){pos = j;break;}
			if (!pos){
				if (!mp.count(ed)) mp[ed] = 1e18;
				chkmin (mp[ed],v + cnt * T);
			}
			else{
				if (!mp.count(s[pos].l)) mp[s[pos].l] = 1e18;
				chkmin (mp[s[pos].l],v + cnt * T);
			}
			for (Int j = i;j <= n;++ j)
				if (s[j].r - D <= s[i].l){
					if (!mp.count(s[j].r)) mp[s[j].r] = 1e18;
					int len = max (0ll,s[j].r - D - x);
					chkmin (mp[s[j].r],v + T + len / D * min (D,T) + min (len % D,T));
				}
			break;
		}
	}
	write (ans),putchar ('\n');
	return 0;
}
posted @ 2022-01-24 20:51  Dark_Romance  阅读(55)  评论(0编辑  收藏  举报