100 3 20 5 5 8 2 10 40 60 100 3 60 5 5 8 2 10 40 60
Good job,rabbit! What a pity rabbit!
dp问题。。。dp加贪心好像不对。。。
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; int main() { int l; while(scanf("%d",&l)!=EOF){ int n,c,t; double dp[110]; int p[110]; memset(p,0,sizeof(p)); memset(dp,INF,sizeof(dp)); scanf("%d%d%d",&n,&c,&t); int vr,v1,v2; scanf("%d%d%d",&vr,&v1,&v2); for(int i=1;i<=n;i++) scanf("%d",&p[i]); p[n+1]=l;//终点看成最后一个充电站。 double T1=l/vr; double c1,c2,c3; if(p[1]>c){ dp[1]=(c/v1)+(p[1]-c)/v2; c1=0; } else{ dp[1]=p[1]/v1; c1=c-p[1]; } for(int i=1;i<=n;i++){ int S=p[i+1]-p[i]; double temp,temp1,temp2; //在当前充电站不充电的情况。 if(c1>0){ if(c1<S){ temp2=(c1/v1); temp2+=(S-c1)/v2; c3=0; } else if(c1>=S){ temp2=S/v1; c3=c1-S; } } else{ temp2=S/v2; } //在当前充电站充电的情况。 if(S>c){ temp1=(c/v1)+((S-c)/v2); c2=0; } else{ temp1=S/v1; c2=(c-S); } temp1+=t; //判断选择哪种方式时间最短,注意剩下的电量所跑距离。 if(temp1==temp2){ temp=temp1; if(c2>c3) c1=c2; else c1=c3; } else if(temp1>temp2){ c1=c3; temp=temp2; } else{ temp=temp1; c1=c2; } dp[i+1]=dp[i]+temp; } if(T1>dp[n+1]) printf("What a pity rabbit!\n"); else printf("Good job,rabbit!\n"); } return 0; }
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; int main() { double l; while(scanf("%lf",&l)!=EOF){ int n; double c,t; double dp[110]; double p[110]; memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp)); scanf("%d%lf%lf",&n,&c,&t); double vr,v1,v2; scanf("%lf%lf%lf",&vr,&v1,&v2); for(int i=1;i<=n;i++) scanf("%lf",&p[i]); p[0]=0;p[n+1]=l; double T1=l/vr,time; dp[0]=0; for(int i=1;i<=n+1;i++){ dp[i]=INF; for(int j=0;j<i;j++){ double S=p[i]-p[j]; if(S>c)time=(c/v1)+(S-c)/v2; else time=S/v1; if(j!=0)time+=t; dp[i]=min(dp[i],dp[j]+time); } } if(T1>dp[n+1]) printf("What a pity rabbit!\n"); else printf("Good job,rabbit!\n"); } return 0; }