题目大意:有一些汽车在左岸,你要用一条小破船把它们拉到右岸去。每个测试点包含多个测试数据。第一行的整数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;
}

相关文章:

  • 2021-09-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-11
  • 2022-01-30
  • 2021-05-26
  • 2022-12-23
猜你喜欢
  • 2021-12-11
  • 2022-12-23
  • 2021-11-18
  • 2022-12-23
  • 2022-02-12
  • 2021-10-02
  • 2021-08-11
相关资源
相似解决方案