QBXT T15214 Day2上午遭遇

题目描述

你是能看到第一题的 friends呢。

—— hja

?座楼房,立于城中 。

第?座楼,高度 ℎ?。

你需要一开始选择座楼,跳。 在第 ?座楼准备跳需要 ??的花费。 每次可以跳到任何一个还没有过的楼上去。但是代价,另外一座楼的代价是两高度差绝对值 ,最后一次从楼上跳到地面不需 要代价(只能跳到地上一次)。为在不超过 要代价(只能跳到地上一次)。为在不超过 ?的情况下,最多跳几次楼。 (一座楼 只能 跳一次 ,且每次 跳楼 都要 计算 准备 的花费 )

输入输出格式

输入格式:
第一行个整数 ?,代表 楼的数量。

接下来一行 ?个整数代表 ??。

接下来一行 ?个整数代表 ℎ?。

最后一行个整数 ?。

输出格式:
一行个整数 代表答案 。

输入输出样例

输入样例#1:

4
3 5 4 11
2 1 3 1
17

输出样例#1:

3
【样例解释】
从1号楼跳到 2号楼再跳到 3号楼是一种 可行 的方案 。
说明

对于 30%的数据, 1≤?≤5。

对于另外 20%的数据,所有 ℎ?相同。

对于另外 20%的数据, ??=0。

P104 zhx 遭遇

第 3 页 共 6 页

对于 100%的数据, 1≤?≤50,1≤??,ℎ?≤106,1≤?≤107。

dp[i][j]表示前i座城市,走j步的最小花费

#include<cstdio>
#include<cstring>
#include<algorithm>
int n;
inline int read() {
	int x=0,f=1;
	char c=getchar() ;
	while(c<'0'||c>'9') {
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
		x=x*10+c-'0',c=getchar();
	return x*f;
}
const int maxn = 106;
struct node{
	int h,w;
	bool operator < (const node & a)const {
		return h<a.h;
	}
}bul[maxn];
int dp[maxn][maxn];//表示前i座城市,走j步的最小话费 
int main() {
	n=read();int ca;
	for(int i=1;i<=n;++i) bul[i].w=read();
	for(int i=1;i<=n;++i) bul[i].h=read();
	std::memset(dp,0x3f,sizeof dp) ;
	for(int i=1;i<=n;++i)dp[i][0]=0;
	std::sort(bul+1,bul+n+1);	
	for (int i=1;i<=n;++i) 
		for (int j=1;j<=i+1;++j) 
			for(int k=1;k<i;++k) {
				dp[i][j]=std::min(dp[i][j],(dp[k][j-1]+bul[k].w+abs(bul[k].h-bul[i].h)));
			}
	int ans=0;
	ca=read();
	for(int i=1;i<=n;++i) 
		for(int j=1;j<=n;++j) 
			if(dp[i][j]+bul[i].w<=ca) {
				ans=std::max(j,ans);
			}
	printf("%d
",ans+1);
	return 0;
}
原文地址:https://www.cnblogs.com/sssy/p/7788150.html