摆渡车
摆渡车
https://ac.nowcoder.com/acm/problem/21471
思路:
1.小于等于当前时间点的人都要上车
2.当前时间没人就跳到下一个有人的时间点
3.考虑是不是要等待下一个人来再开车
参考代码如下:
//100pts 500 100 4e6
#include<cstdio>
#include<algorithm>
#define INF 2147483647
int n,m;
int data[1024];
int sum[1024];
int dp[1024][128];
int main()
{
//freopen(""bus.in"",""r"",stdin);
//freopen(""bus.out"",""w"",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",data+i);
std::sort(data+1,data+n+1);
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+data[i];
for(int i=1;i<=n;++i)
for(int j=0;j<m;++j)
{
int now=data[i]+j;
if(j)dp[i][j]=dp[i][j-1];
else dp[i][j]=now*i-sum[i];
for(int last=std::max(now-2*m+1,0);last<=now-m;++last)
{
int x=std::lower_bound(data+1,data+n+1,last+1)-data-1;
int y=std::min(last-data[x],m-1);
int tmp=dp[x][y]+(i-x)*now-(sum[i]-sum[x]);
if(tmp<dp[i][j])dp[i][j]=tmp;
}
}
printf("%d\n",dp[n][m-1]);
fclose(stdin);
fclose(stdout);
return 0;
}
查看10道真题和解析