Problem : 1494 ( 跑跑卡丁车 ) Judge Status : Accepted
//每个赛段有两种选择:放N2O和不放,所有的能量状态就有15种,我们总是选择用时最短的,要注意最后能量爆满清零时也可能获得最优解。
#include<iostream>
using namespace std ;
#define E 15
int main ()
{
long int i ,j ,k ,m ,n ;
long int aaa [ 102 ],bbb [ 102 ],eng [E ],eng1 [E ];
long cost ;
while (scanf ( "%ld%ld" ,&n ,&m )!=EOF )
{
for (i = 1 ;i <E ;i ++)
eng [i ]= 1000000 ;
cost = 1000000 ;
eng [ 0 ]= 0 ;
for (i = 0 ;i <n ;i ++)
scanf ( "%ld" ,&aaa [i ]);
for (i = 0 ;i <n ;i ++)
scanf ( "%ld" ,&bbb [i ]);
eng1 [ 0 ]= 1000000 ;
for (i = 0 ;i <m ;i ++)
for (j = 0 ;j <n ;j ++)
{ for (k = 0 ;k <E - 1 ;k ++) {
eng1 [k + 1 ]=eng [k ]+aaa [j ];
if (k > 4 &&eng [k ]+bbb [j ]<eng1 [k - 5 ])
{
eng1 [k - 5 ]=eng [k ]+bbb [j ];
}
}
if (eng [E - 1 ]+bbb [j ]<eng1 [E - 6 ])
eng1 [E - 6 ]=eng [E - 1 ]+bbb [j ];
if (eng [E - 1 ]+aaa [j ]<eng1 [E - 5 ])
eng1 [E - 5 ]=eng [E - 1 ]+aaa [j ];
for (k = 0 ;k <E ;k ++)
eng [k ]=eng1 [k ];
eng1 [ 0 ]= 1000000 ;
}
for (i = 0 ;i <E ;i ++)
if (cost >eng [i ])
cost =eng [i ];
cout <<cost <<endl ;
}
return 0 ;
}
using namespace std ;
#define E 15
int main ()
{
long int i ,j ,k ,m ,n ;
long int aaa [ 102 ],bbb [ 102 ],eng [E ],eng1 [E ];
long cost ;
while (scanf ( "%ld%ld" ,&n ,&m )!=EOF )
{
for (i = 1 ;i <E ;i ++)
eng [i ]= 1000000 ;
cost = 1000000 ;
eng [ 0 ]= 0 ;
for (i = 0 ;i <n ;i ++)
scanf ( "%ld" ,&aaa [i ]);
for (i = 0 ;i <n ;i ++)
scanf ( "%ld" ,&bbb [i ]);
eng1 [ 0 ]= 1000000 ;
for (i = 0 ;i <m ;i ++)
for (j = 0 ;j <n ;j ++)
{ for (k = 0 ;k <E - 1 ;k ++) {
eng1 [k + 1 ]=eng [k ]+aaa [j ];
if (k > 4 &&eng [k ]+bbb [j ]<eng1 [k - 5 ])
{
eng1 [k - 5 ]=eng [k ]+bbb [j ];
}
}
if (eng [E - 1 ]+bbb [j ]<eng1 [E - 6 ])
eng1 [E - 6 ]=eng [E - 1 ]+bbb [j ];
if (eng [E - 1 ]+aaa [j ]<eng1 [E - 5 ])
eng1 [E - 5 ]=eng [E - 1 ]+aaa [j ];
for (k = 0 ;k <E ;k ++)
eng [k ]=eng1 [k ];
eng1 [ 0 ]= 1000000 ;
}
for (i = 0 ;i <E ;i ++)
if (cost >eng [i ])
cost =eng [i ];
cout <<cost <<endl ;
}
return 0 ;
}