已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

TA的其他文章

解题思路:

注意事项:

参考代码:

#include

using namespace std;

#define maxn 100000000

#define maxm 1010

#define maxk 1010

#define maxB 1000010

#define maxC 1000010

#define maxv 1000010

#define inf INT_MAX

typedef long long ll;

ll n,m,k,v;

ll A[maxm],B[maxm],C[maxm];

ll dp[maxm][maxk];//dp[i][j]表示走完第i个红绿灯, 

//瞬移装置还需冷却j个红绿灯,这种情况下的最小用时 

//显然0<=i<=m,0<=j<=k-1 

ll waittime(ll t,int x){//在第x个路口等待,等待开始的时间为t,返回等待的时间长度 

int ret;

ret=t%(B[x]+C[x]);

if(ret<B[x])return 0;

else return B[x]+C[x]-ret;

}

int main(){

scanf("%lld%lld%lld%lld",&n,&m,&k,&v);

for(ll i=1;i<=m;i++){

scanf("%lld%lld%lld",&A[i],&B[i],&C[i]);

}

dp[0][0]=0;

for(int i=1;i<=k-1;i++){

dp[0][i]=inf;

}

for(ll i=1;i<=m;i++){

dp[i][0]=min(dp[i-1][0]+(A[i]-A[i-1])*v+waittime(dp[i-1][0]+(A[i]-A[i-1])*v,i),//可以开但不开瞬移 

             dp[i-1][1]+(A[i]-A[i-1])*v+waittime(dp[i-1][1]+(A[i]-A[i-1])*v,i));//开不了瞬移 

for(ll j=1;j<=k-2;j++){//开不了瞬移 

dp[i][j]=dp[i-1][j+1]+(A[i]-A[i-1])*v+waittime(dp[i-1][j+1]+(A[i]-A[i-1])*v,i);

}

dp[i][k-1]=dp[i-1][0]+waittime(dp[i-1][0],i);//开瞬移 

}

ll mintime=dp[m][0]+0;//直接瞬移到公司

for(ll i=1;i<=k-1;i++){

mintime=min(mintime,dp[m][i]+(n-A[m])*v);//走完最后一个路口还有n-A[m]的路程,并不是就结束了。

}

printf("%lld",mintime);

return 0;


 

0.0分

3 人评分

  评论区

头文件不放是吧,好好好
#include <cstdio>;
#include <algorithm>;
#include <climits>;
2024-03-28 21:13:10
  • «
  • 1
  • »