摆渡车
摆渡车
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; }