poj 2336

题目大意:有一些汽车在左岸,你要用一条小破船把它们拉到右岸去。每个测试点包含多个测试数据。第一行的整数C表示测试数据的数目。接下来每个测试数据的 第一行为三个整数N, T, M表示一次可以运送N辆汽车,到达对岸的时间为T,汽车的总数是M。接下来的M行每行有一个整数,表示这辆汽车什么时候会来到左岸。对于每个测试数据,输 出两个整数,分别是最少要耗用多少时间(包括你等车的时间,就是从0开始直到最后一辆车到达右岸),以及在这个前提下你最少要运送多少次。只要到右岸去就 算作一次。

dp

dp[i]=max(dp[j],a[i])+2*t,(i-n<=j<i).

cnt[i]=cnt[j]+1(有待证明)。

View Code
#include<iostream>
#include
<fstream>

using namespace std;

int n,m,t;
int a[1500];
int dp[1500];
int cnt[1500];

void read(){
// ifstream cin("in.txt");
int i,j,k;
int K;
cin
>>K;
while(K--)
{
cin
>>n>>t>>m;
for(i=1;i<=m;i++)
cin
>>a[i];
memset(dp,
0,sizeof(dp));
memset(cnt,
0,sizeof(cnt));

for(i=1;i<=m;i++)
{
dp[i]
=10000000;
for(j=max(i-n,0);j<i;j++)
{
if(max(dp[j],a[i])<dp[i])
{
dp[i]
=max(dp[j],a[i]);
cnt[i]
=cnt[j]+1;
}

}
dp[i]
+=2*t;
}
cout
<<dp[m]-t<<' '<<cnt[m]<<endl;

}

}

int main(){
read();
return 0;
}

posted on 2011-02-24 14:47  宇宙吾心  阅读(402)  评论(0)    收藏  举报

导航