POJ 2336 Ferry Loading II 贪心 || 伪dp
Description:NULL ( 233333因为我懒 )
哦。。这个解题报告是我从lzy自带解题报告的代码里摘来的233
最早到达对岸的时间,取决于最后一辆车的被运送时间
最优解是最后一辆车能够被尽早的运走
if(a > dp[i - j]) dp[i] = min(dp[i], 2 * t + a);
else dp[i] = min(dp[i], 2 * t + dp[i - j]);dp[i]表示第i个车到达对岸花的最少时间, a是第i辆车的到达时间。
由于第 i 个车可以和它前面的 j(1 ~ n - 1)个车一起坐船,所以可以
得到dp[i] = min(dp[i], dp[i - j] + 2 * t);但是第 i 个车到达的时间可能大于了dp[i - j],这样就会等第 i个车
,又得dp[i] = min(dp[i], a + 2 * t);最后一次不用返回了,所以dp[m]-t;
船运的次数:num[i]=min{ num[i-j] }+1;
dp代码:
1 #include <iostream> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <algorithm> 5 #include <stdio.h> 6 #include <stdio.h> 7 8 using namespace std; 9 int n, t, m, c, f[1500], num[1500]; 10 int main() 11 { 12 scanf("%d", &c); 13 while(c --){ 14 memset(num, 127, sizeof(num)); 15 memset(f, 127, sizeof(f)); 16 f[0] = 0; 17 num[0] = 0; 18 scanf("%d%d%d", &n, &t, &m); 19 for(int i = 1; i <= m; i ++){ 20 int a; scanf("%d", &a); 21 for(int j = 1; j <= n; j ++){ 22 if(i - j < 0) break; 23 if(a > f[i - j]) f[i] = min(f[i], 2 * t + a); 24 else f[i] = min(f[i], f[i - j] + 2 * t); 25 num[i] = min(num[i], num[i - j] + 1); 26 } 27 } 28 printf("%d %d\n", f[m] - t, num[m]); 29 } 30 return 0; 31 }
贪心版代码(lzy写的):
1 #include <iostream> 2 #include <iomanip> 3 #include <string.h> 4 #include <string> 5 #include <math.h> 6 #include <time.h> 7 #include <cstdlib> 8 #include <cstdio> 9 #include <climits> 10 #include <algorithm> 11 #include <vector> 12 #include <stack> 13 #include <queue> 14 #include <sstream> 15 16 using namespace std ; 17 18 #define LL long long 19 #define PI M_PI 20 const int MAXN = 1e7 + 5 ; //int A[MAXN] ; 21 const int maxn = 1e4 + 5 ; //int a[maxn] ; 22 23 int et[1500]; 24 25 int main() 26 { 27 freopen("ferry.in","r",stdin) ; 28 freopen("ferry.out","w",stdout) ; 29 30 int n, t, m ; 31 scanf("%d %d %d", &n, &t, &m) ; 32 33 for(int i = 1 ; i <= m ; i++) 34 { 35 scanf("%d", &et[i] ) ; 36 } 37 38 int dd = m%n ,ff = m/n ; 39 int ans=0 ,cnt=0 ; 40 41 if(dd!=0) 42 { 43 ans = et[dd] ; 44 ans = ans + t*2 ; 45 cnt++ ; 46 } 47 for(int i = dd+n ; i <= m ; ) 48 { 49 if( ans< et[i]) 50 ans=et[i] ; 51 ans = ans+2*t ; 52 i=i+n ; 53 cnt++ ; 54 } 55 printf("%d %d\n", ans-t, cnt++ ) ; 56 57 return 0; 58 }
贪心 by lzy
NAILED IT ..
------------------------------
时间: 2025-01-21 19:50:21