18 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 8 8
145对于sample这组数据,你可以先在普通情况下行驶前14段,这时你有2个加速卡以及80%的能量(N2O).在第15和16段用掉2个加速卡,通过第 17段赛道后又可以得到一个加速卡,在第18段赛道使用.HintHint
#include <stdio.h> #include <iostream> #include <algorithm> #include <cmath> #include <map> #include <string> using namespace std; int time[2][20]; //一维滚动数组 int a[110],b[110]; int main() { int L,n; while(scanf("%d%d",&L,&n)!=EOF) { for(int i=0;i<=14;i++) { time[0][i]=99999999; } time[0][0]=0; for(int i=0;i<L;i++) cin>>a[i]; for(int i=0;i<L;i++) cin>>b[i]; int cur=0; for(int i=0;i<n;i++) { for(int j=0;j<L;j++) { cur^=1; for(int k=0;k<=14;k++) time[cur][k]=99999999; /* for(int k=0;k<=14;k++) { if(k%5==0) puts(""); printf("%9d",time[cur^1][k]); } puts("\n"); */ for(int k=0;k<=14;k++) { //加速 b if(k<=9) time[cur][k]=min(time[cur][k],time[cur^1][k+5]+b[j]); //普通 a if(k!=0) time[cur][k]=min(time[cur][k],time[cur^1][k-1]+a[j]); //if(k==10) //time[cur][10]=min(time[cur][10],time[cur^1][14]+a[j]); } } } int minn=99999999; for(int i=0;i<=14;i++) minn=min(minn,time[cur][i]); printf("%d\n",minn); } return 0; } /* int time[2][5][10];//一维滚动数组 二维记录有几张卡 三维记录当前有多少NO int a[110],b[110];//耗时间 int main() { int L,n; while(scanf("%d%d",&L,&n)!=EOF) { for(int i=0;i<3;i++) { for(int j=0;j<5;j++) { time[0][i][j]=99999999; } } time[0][0][0]=0; for(int i=0;i<L;i++) { scanf("%d",a+i); } for(int i=0;i<L;i++) { scanf("%d",b+i); } int cur=0; for(int i=0;i<n;i++)//quan { for(int j=0;j<L;j++)//duan { cur^=1;//当前的 for(int k=0;k<3;k++) { for(int l=0;l<5;l++) { //printf("%8d ",time[cur^1][k][l]); time[cur][k][l]=99999999; } //puts(""); } //puts(""); //用卡加速的情况 //b for(int k=0;k<2;k++) { for(int l=0;l<5;l++) { time[cur][k][l]=min(time[cur][k][l],time[cur^1][k+1][l]+b[j]); } } //不用卡的情况 //a for(int k=0;k<3;k++) { for(int l=0;l<5;l++) { if(l!=0)//增加 NO time[cur][k][l]=min(time[cur][k][l],time[cur^1][k][l-1]+a[j]); else if(k!=0)// { time[cur][k][l]=min(time[cur][k][l],time[cur^1][k-1][4]+a[j]);//增加卡片 if(k==2)//卡片 超过2 不增加卡片 time[cur][k][l]=min(time[cur][k][l],time[cur^1][k][4]+a[j]); } } } } } int ans=99999999; for(int k=0;k<3;k++) { for(int l=0;l<5;l++) { ans=min(ans,time[cur][k][l]); } } printf("%d\n",ans); } return 0; }*/ /* 18 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 8 8 */
原文:http://blog.csdn.net/u013532224/article/details/44130915