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;
}

浙公网安备 33010602011771号