这道题说是像那个color length 一样可以类似预处理的方式。。。
还学了用floor函数。。。
如果是要整数的话 ,就直接%。0f就可以了,,
然而自己不知道为什么基本是照着敲的,还是样例都错了。。
不过要注意什么时候 哪些东西最好一开始就弄double
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 10000000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
double v,sx;
int n;
const int maxn=1005;
//2017-4-17 09:56:47
double d[maxn][maxn][2];
int vis[maxn][maxn][2];
double psdt[maxn];
struct Node{
double x,c,dt;
bool friend operator <(Node a,Node b){
return a.x<b.x;
}
}node[maxn];
double cost(double x1,double x2,int i,int j){
double finished=0;
if(i>=0&&j>=0)finished+=psdt[j]-psdt[i-1];//这个地方表达的意思挺好的。。
return (psdt[n]-finished)*fabs(x2-x1)/v;//这个地方就是类似color的地方。
}
double dp(int i,int j,int p){
if(i==1&&j==n)return 0;
double &ans=d[i][j][p];
if(vis[i][j][p])return ans;
vis[i][j][p]=1;
ans=INF;
double x=(p==0?node[i].x:node[j].x);
if(i>1)ans=min(ans,dp(i-1,j,0)+cost(x,node[i-1].x,i,j));
if(j<n)ans=min(ans,dp(i,j+1,1)+cost(x,node[j+1].x,i,j));
/*
if(p==0){
if(i>1)ans=min(ans,dp(i-1,j,0)+cost(node[i].x,node[i-1].x,i,j));
if(j<n)ans=min(ans,dp(i,j+1,1)+cost(node[i].x,node[j+1].x,i,j));
}
else{
if(i>1)ans=min(ans,dp(i-1,j,0)+cost(node[j].x,node[i-1].x,i,j));
if(j<n)ans=min(ans,dp(i,j+1,1)+cost(node[j].x,node[j+1].x,i,j));
}*/
return ans;
}
int main(){
while(scanf("%d%lf%lf",&n,&v,&sx)==3&&n){
memset(vis,0,sizeof(vis));
double sumc=0;
for(int i=1;i<=n;++i){
scanf("%lf%lf%lf",&node[i].x,&node[i].c,&node[i].dt);
sumc+=node[i].c;
}
sort(node+1,node+1+n);
psdt[0]=0;
for(int i=1;i<=n;++i)
psdt[i]=psdt[i-1]+node[i].dt;
node[0].x=-INF;
node[n+1].x=INF;
double ans=INF;
for(int i=1;i<=n+1;++i){
if(sx>node[i-1].x&&sx<node[i].x){
if(i>1)ans=min(ans,dp(i-1,i-1,0)+cost(sx,node[i-1].x,-1,-1));
if(i<=n)ans=min(ans,dp(i,i,0)+cost(sx,node[i].x,-1,-1));//这个地方没有抄到。。注意要是i<=n;
break;
}
}
printf("%.0lf\n",floor(ans+sumc));
}
}
本文探讨了一种基于动态规划的算法实现方案,通过具体的竞赛编程案例,详细讲解了如何运用预处理技巧解决复杂的问题。文章重点介绍了使用双精度浮点数进行精确计算的方法,并通过代码示例展示了如何优化成本函数的计算过程。

被折叠的 条评论
为什么被折叠?



