湘潭大学oj 1206 Dormitory's Elevator dp

27153 njczy2010 1206 Accepted 1976 KB 234 MS G++ 1415 B 2014-09-28 10:01:23

真是吐血ac,,,,这么easy的题。。。。。

Dormitory‘s Elevator

Accepted : 46   Submit : 302
Time Limit : 1000 MS   Memory Limit : 65536 KB

Problem Description

The new dormitory has N(1≤N≤100000) floors and M(1≤M≤100000)students. In the new dormitory, in order to save student‘s time as well as encourage student exercise, the elevator in dormitory will not stop in adjacent floor. So if there are people want to get off the elevator in adjacent floor, one of them must walk one stair instead. Suppose a people go down 1 floor costs A energy, go up 1 floor costs B energy(1≤A,B≤100). Please arrange where the elevator stop to minimize the total cost of student‘s walking cost.All students and elevator are at floor 1 initially, and the elevator can not godown and can stop at floor 2.

Input

First line contain an integer T, there are T(1≤T≤10) cases. For each case T, there are two lines. First line: The number of floors N(1≤N≤100000), and the number of students M(1≤M≤100000),A,B(1≤A,B≤100) Second line: M integers (2≤A[i]≤N), the student‘s desire floor.

Output

Output case number first, then the answer, the minimum of the total cost of student‘s walking cost.

Sample Input

1
3 2 1 1
2 3

Sample Output

Case 1: 1

Source

daizhenyang

a代表上楼?????? 这点还是没弄清,,,,什么情况。。。。

好吧,,,,我懂了。。。。泪流满面啊。。。。

题解转自:http://blog.csdn.net/y990041769/article/details/39343269

分析:这其实就是一个简单的一维dp,用dp【i】表示从1层上到第 i 层花费的最小的体力。

因为不能在相邻的楼层停留,所以可以从dp【i-2】转移,但这样不是最优的还要从dp【i-3】转移,因为这样的话就可以到达所有的楼层。我们只要在所有的之间dp最优即可。

其他要注意的一个条件是,从dp【i-3】转移时,中间两层的人有四种选择:

1:都上去或都下来

2:上面的上去一层,下面的下来一层

3:上面的下来两层,下面的上去两层,(当时没有考虑到这个,要细心啊)

那么代码就很好写了、

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<map>
 9 #include<string>
10
11 #define N 100005
12 #define M 15
13 #define mod 10000007
14 //#define p 10000007
15 #define mod2 100000000
16 #define ll long long
17 #define LL long long
18 #define maxi(a,b) (a)>(b)? (a) : (b)
19 #define mini(a,b) (a)<(b)? (a) : (b)
20
21 using namespace std;
22
23 int T;
24 int n,m;
25 int cnt[N];
26 int a,b;
27 int dp[N];
28 int x;
29 int ans;
30 int c;
31
32 void ini()
33 {
34     ans=0;
35     memset(cnt,0,sizeof(cnt));
36     memset(dp,0x3f3f3f3f,sizeof(dp));
37     scanf("%d%d%d%d",&n,&m,&b,&a);
38     c=min(a,b);
39     for(int i=1;i<=m;i++){
40         scanf("%d",&x);
41         cnt[x]++;
42     }
43     dp[0]=0;
44     dp[1]=0;
45     dp[2]=0;
46     dp[3]=c*cnt[2];
47
48 }
49
50
51 void solve()
52 {
53     int i;
54     for(i=4;i<=n;i++){
55         dp[i]=min(dp[i-2]+c*cnt[i-1],dp[i-3]+cnt[i-2]*min(a,2*b)+cnt[i-1]*min(b,2*a));
56     }
57     ans=min(dp[n],dp[n-1]+cnt[n]*a);
58 }
59
60 void out()
61 {
62     printf("%d\n",ans);
63 }
64
65 int main()
66 {
67     //freopen("data.in","r",stdin);
68     //freopen("data.out","w",stdout);
69     scanf("%d",&T);
70     for(int ccnt=1;ccnt<=T;ccnt++)
71    // while(T--)
72    // while(scanf("%d%d",&n,&m)!=EOF)
73     {
74       //  if(n==0 && m==0) break;
75         printf("Case %d: ",ccnt);
76         ini();
77         solve();
78         out();
79     }
80
81     return 0;
82 }

湘潭大学oj 1206 Dormitory's Elevator dp

时间: 2024-11-05 09:37:02

湘潭大学oj 1206 Dormitory's Elevator dp的相关文章

XTUOJ 1206 Dormitory&#39;s Elevator

Dormitory's Elevator Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description The new dormitory has N(1≤N≤100000) floors and M(1≤M≤100000)students. In the new dormitory, in order to save student's time as well as encourage student exercise,

XTU 1206 Dormitory&#39;s Elevator

Dormitory's Elevator Accepted : 52   Submit : 332 Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description The new dormitory has N(1≤N≤100000) floors and M(1≤M≤100000)students. In the new dormitory, in order to save student's time as well a

Light OJ 1031 - Easy Game(区间dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅限在一端, 他们的得分分别是取得所有值的和.现在求这两个选手得分差值的最大值. 解题思路:设dp[i][j]代表从i到j这个区间中,所能够得到的最大差值,只需要枚举其中i到j之间的一个数c,作为断电,那么最大值应该为max(sum[c]-sum[i-1]-dp[c+1][j], sum[j]-sum

Light OJ 1033 - Generating Palindromes(区间DP)

题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串. ======================================================================================= #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include&l

【上海交大oj】数学题3(数位dp)

1398. 数学题3 题目描述 给定一个数字,他在十进制下从高位到低位一次是n0, n1, n2, n3,... 那么定义它的“差和”为n0-n1+n2-n3+... 如:十进制数字abcdefg,每个字母代表一个位,那么差和为a-b+c-d+e-f+g. 所以十进制数字1234567差和为1-2+3-4+5-6+7=4 现在给你们一个闭区间[m, n],请求出区间内差和为x的数字个数. 输入格式 输入只有一行,三个数字,m n x 30%: 0<= m <= n <=10^3, 50%

[Swust OJ 402]--皇宫看守(树形dp)

题目链接:http://acm.swust.edu.cn/problem/402/ Time limit(ms): 5000 Memory limit(kb): 65535 Description 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.  皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同.  可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫

Light OJ 1004 - Monkey Banana Problem dp题解

1004 - Monkey Banana Problem PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You are in the world of mathematics to solve the great "Monkey Banana Problem". It states that, a monkey enters into a diamond shaped two dim

Light OJ 1030 - Discovering Gold(概率dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1030 题目大意:有一个很长的洞穴, 可以看做是1-n的格子.你的起始位置在1的地方, 每个格子中都有价值为v[i]的宝藏. 有一个6面的骰子,数字为从1-6, 每次摇一次骰子, 得到的数字x后, 你可以到达距离当前位置大x的位置, 并且得到那个位置的宝藏. 如果要走的位置在n的外面, 那么在此摇骰子, 直到找到一个合适的数字.到达n位置的时候结束. 现在想知道走到n位置的能够

[Swust OJ 360]--加分二叉树(区间dp)

题目链接:http://acm.swust.edu.cn/problem/360/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下: subtree的左子树的加分×