喵,我喜欢喵喵
  • 板块灌水区
  • 楼主lucy2012
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/12 23:20
  • 上次更新2024/8/13 08:59:06
查看原帖
喵,我喜欢喵喵
1252442
lucy2012楼主2024/8/12 23:20

题面

看不了看这个:

题目描述

桃子正在驾驶汽车,她偏好于在休息站停靠停歇。确切而言,她不能持续开车达到 m 分钟。汽车每分钟的速度能够增加 1、减少 1 或者维持不变,且汽车的速度上限为 k 。如今已知整个旅程共计 n 分钟,以及在第几分钟会出现休息站。倘若要在休息站停靠,那么此时汽车的车速必须降为 0,同时可以忽略在休息站休息所花费的时间。现在请您求出每分钟车速总和的最大值。

输入格式

输入的第一行包含四个正整数 n、m、k、q ,其中 q 表示休息站的数量。

接下来的一行包含 q 个正整数,分别代表休息站出现的时间 ai (1≤ai≤n),保证给出的 q 个正整数呈递增趋势,并且确保汽车一定能够抵达目的地。

输出格式

输出一行,一个整数,即为答案。

示例 1

输入 1

5 3 3 3

1 3 5

输出 1

5

解释 1

由于不能连续开车 3 分钟,所以选择在第 3 分钟进入休息站(此时车速必须为 0),因此这五分钟的车速分别为 [1,1,0,1,2],车速总和为 5。需要注意的是,如果在第 2 分钟加速到速度 2,就无法在第 3 分钟时将车速变为 0 进入休息站,所以在第 2 分钟保持车速不变是最为合理的选择。

示例 2

输入 2

8 9 3 2

3 7

输出 2

21

解释 2

不能有连续 9 分钟处于开车状态,然而整个行程仅有 8 分钟,所以可以不停靠休息站。在这种情况下,汽车的速度仅受到上限值 k = 3 的影响,所以每分钟的车速为 [1,2,3,3,3,3,3,3],车速总和为 21。

数据规模与约定

对于 10%的数据,有 q≤3,1≤n、m、k≤10

对于 30%的数据,有 q≤1000,1≤n、m、k≤4000

对于 100%的数据,有 1≤q≤1000,1≤n、m、k≤10^9

那现在,这是题解代码,可是我没有看到(在代码中我的话用喵开头):

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,q,dp[10005],ans = -1,a[10005];
int calc(int l){
	int nl = min(k,l / 2);//最高只能跑到k,l / 2之后的路程只能缓慢减速(见题面)
	return nl * (l - nl); // (0 + nl) * (l - nl) / 2 * 2;
}
int calc2(int l){
	int nl = min(k,l);
	return nl * (l - nl) + nl * (nl + 1) / 2;//不用减速了
}
signed main(){
	//freopen("road.in","r",stdin);
	//freopen("road.out","w",stdout);
	cin >> n >> m >> k >> q;
	memset(dp,-0x3f,sizeof(dp));//求最大值//喵为什么要命值为-1
	for(register int i = 1;i <= q;++i)cin >> a[i];
	a[0] = 0;
	dp[0] = 0;//初始化
	for(register int i = 1;i <= q;++i){
		for(register int j = i - 1;~j && a[i] - a[j] <= m;--j){//~j等价于j > -1
			if(~dp[j])dp[i] = max(dp[i],dp[j] + calc(a[i] - a[j]));//转移,从j ~ i的最高总速度//喵:和上面一样,为什么要判断是否命值过
		}
	}
	for(register int i = 0;i <= q;++i){
		if(~dp[i] && n - a[i] <= m)ans = max(ans,dp[i] + calc2(n - a[i]));//跑到最后一个点速度不限
	}
	cout << ans << '\n';
	return 0;
}

还有这个代码为什么没有ac:

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,q,a[10010],dp[10010],ans;
int f(long long x){
	long long maxx=min(k,x/2);
	return maxx*(x-maxx);
}
int fs(long long x){
	long long maxx=min(k,x);
	return maxx*(x-maxx)+maxx*(maxx+1)/2;
}
int main(){
	cin>>n>>m>>k>>q;
	memset(dp,-1,sizeof(dp));
	for(int i=1;i<=q;i++){
		cin>>a[i];
	}
	dp[0]=0;
	for(int i=1;i<=q;i++){
		for(int j=i-1;j>-1&&a[i]-a[j]<=m;j--){
			if(dp[j]>-1)
			    dp[i]=max(dp[i],dp[j]+f(a[i]-a[j]));
		}
	}
	for(int i=0;i<=q;i++){
		if(n-a[i]<=m&&dp[i]>-1)
		    ans=max(ans,dp[i]+fs(n-a[i]));
	}
	cout<<ans;
	return 0;
}
2024/8/12 23:20
加载中...