JZOJ5907. 【NOIP2018模拟10.16】轻功(qinggong)

87 篇文章 0 订阅

Description

题目背景:
尊者神高达进入了基三的世界,作为一个 mmorpg 做任务是必不可少的,然而跑地图却令人十分不爽。好在基三可以使用轻功,但是尊者神高达有些手残,他决定用梅花桩练习轻功。
题目描述:
一共有 n 个木桩,要求从起点(0)开始,经过所有梅花桩,恰好到达终点 n,尊者神高达一共会 k 种门派的轻功,不同门派的轻功经过的梅花桩数不同,花费时间也不同。但是尊者神高达一次只能使用一种轻功,当他使用别的门派的轻功时,需要花费 W 秒切换(开始时可以是任意门派,不需要更换时间)。由于尊者神高达手残,所以经过某些梅花桩(包括起点和终点)时他不能使用一些门派的轻功。尊者神高达想知道他最快多久能到达终点如果无解则输出-1。

题解

很显然就是dp,
f i , j f_{i,j} fi,j表示到达第i个点,当前是j这种轻功。
转移就枚举之前那个点是用的哪一种轻功。
至于判断某些点不能被跨过,可以用前缀和来维护,
如果前缀和不相同,就是说明中间有至少一个点不能被跨过。

code

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#define N 103
#define G getchar
using namespace std;
char ch;
void read(int &n)
{
	n=0;
	ch=G();
	while((ch<'0' || ch>'9') && ch!='-')ch=G();
	int w=1;
	if(ch=='-')w=-1,ch=G();
	while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();
	n*=w;
}

long long min(long long a,long long b){return a<b?a:b;}

int n,k,w,s[N][N*5],x,p,a[N],v[N],q;
long long f[N][N*5],ans;

int main()
{
	freopen("qinggong.in","r",stdin);
	freopen("qinggong.out","w",stdout);
	
	read(n);read(k);read(w);
	for(int i=1;i<=k;i++)read(a[i]),read(v[i]);
	read(q);
	for(int i=1;i<=q;i++)
		read(x),read(p),s[p][x]++;
	for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++)
			s[i][j]=s[i][j]+s[i][j-1];
	
	memset(f,127,sizeof(f));
	for(int i=1;i<=k;i++)f[i][0]=0;
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=k;j++)
		{
			if(a[j]>i)continue;
			if(s[j][i]^s[j][i-a[j]])continue;
			for(int t=1;t<j;t++)f[j][i]=min(f[j][i],f[t][i-a[j]]);
			for(int t=j+1;t<=k;t++)f[j][i]=min(f[j][i],f[t][i-a[j]]);
			f[j][i]=min(f[j][i]+w,f[j][i-a[j]])+v[j];
		}
	
	ans=f[0][0];
	for(int i=1;i<=k;i++)ans=min(ans,f[i][n]);
	if(ans^f[0][0])printf("%lld",ans);else printf("-1");
	
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值