标签:
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 }
NAILED IT ..
------------------------------
标签:
原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5720671.html