看不了看这个:
题目描述
桃子正在驾驶汽车,她偏好于在休息站停靠停歇。确切而言,她不能持续开车达到 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;
}