码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2336 Ferry Loading II

时间:2016-07-30 13:28:56      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

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 }
POJ 2336 Ferry Loading II

贪心版代码(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 ..

------------------------------

POJ 2336 Ferry Loading II

标签:

原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5720671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!