动规-某动规专练 Round1 (April, 2018)

题目不太难,老板讲得真好(斜眼笑。

D题租房子,挺暴力的,不过老板说过,敢写就敢A,哈哈。

 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 double f[2][3];
 7 
 8 int main()
 9 {
10     int t;
11     scanf("%d", &t);
12     for (int i = 1; i <= t; ++i) {
13         double tmp;
14         scanf("%lf", &tmp);
15         f[i&1][0] = max(max(f[i&1^1][0], f[i&1^1][1]), f[i&1^1][2]);
16         f[i&1][1] = max(f[i&1^1][0], f[i&1^1][1]) + tmp;
17         f[i&1][2] = max(f[i&1^1][0], f[i&1^1][1]) + tmp*tmp;
18     }
19     printf("%.4lf
", max(max(f[t&1][0], f[t&1][1]), f[t&1][2]));
20     return 0;
21 }
A
 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const int _N = 3200;
 7 
 8 typedef long long LL;
 9 
10 LL A[_N], B[_N], f[_N][_N];
11 
12 int main()
13 {
14     LL i, j, N, M;
15     scanf("%lld%lld", &N, &M);
16     for (i = 1; i <= N; ++i) scanf("%lld", &A[i]);
17     for (i = 1; i <= M; ++i) scanf("%lld", &B[i]);
18     for (i = 1; i <= N; ++i)
19         for (j = 1; j <= M; ++j)
20             f[i][j] = max(f[i][j-1], max(f[i-1][j], f[i-1][j-1] + A[i] - B[j]));
21     printf("%lld", f[N][M]);
22     return 0;
23 }
B
 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 
 8 const int _N = 3300;
 9 const long long INF = 999999999999LL;
10 
11 LL H[_N], f[_N], V[_N], T[_N], G[_N];
12 
13 int main()
14 {
15     LL N, i, j, ans;
16     scanf("%lld", &N);
17     for (i = 1; i <= N; ++i) {
18         scanf("%lld%lld%lld", &H[i], &G[i], &V[i]);
19         if (V[i] == 2) scanf("%lld", &T[i]);
20     }
21     for (i = 1; i <= N; ++i) {
22         f[i] = G[i];
23         LL meg = INF;
24         for (j = i-1; j >= 1; --j) {
25             if (H[j] + T[j] <= meg && H[i] < H[j] + T[j])
26                 f[i] = max(f[i], f[j] + G[i]);
27             if (V[j] == 1) meg = min(meg, H[j]);
28         }
29     }
30     ans = f[1];
31     for (i = 2; i <= N; ++i) ans = max(ans, f[i]);
32     printf("%lld
", ans);
33     return 0;
34 }
C
 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 
 8 int f[2][520][520];
 9 
10 struct node {
11     int l, r, gain;
12 } A[120];
13 
14 bool _cmp(const node &t1, const node &t2) { return t1.l < t2.l || t1.l == t2.l && t1.r < t2.r; }
15 
16 void OhYeahVanYouSeeDeeeeeepDarkFantasies(int v) { printf("%d
", v); return; }
17 
18 int main()
19 {
20     int T, N, i, a, b, ans;
21     scanf("%d%d", &T, &N);
22     for (i = 1; i <= N; ++i)
23         scanf("%d%d%d", &A[i].l, &A[i].r, &A[i].gain);
24         
25     sort(A+1, A+1+N, _cmp);
26     
27     for (i = 1; i <= N; ++i)
28         for (a = 0; a <= T; ++a)
29             for (b = 0; b <= T; ++b) {
30                 f[i&1][a][b] = max(f[i&1][a][b], f[i&1^1][a][b]);
31                 if (a < A[i].l) f[i&1][A[i].r][b] = max(f[i&1][A[i].r][b], f[i&1^1][a][b] + A[i].gain);
32                 if (b < A[i].l)    f[i&1][a][A[i].r] = max(f[i&1][a][A[i].r], f[i&1^1][a][b] + A[i].gain);
33             }
34     
35     
36     ans = 0;
37     for (a = 0; a <= T; ++a)
38         for (b = 0; b <= T; ++b)
39             ans = max(ans, f[N&1][a][b]);
40     
41     OhYeahVanYouSeeDeeeeeepDarkFantasies(ans);
42     return 0;
43 }
D
 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 
 8 const int _N = 500;
 9 
10 LL wei[_N], lim[_N], gain[_N], L[_N], R[_N], f[_N][_N];
11 bool book[_N];
12 
13 void diudiu(LL node)
14 {
15     if (book[node]) return;
16     f[node][0] = gain[node];
17     LL k, t, v;
18     for (k = L[node]; k; k = R[k]) {
19         diudiu(k);
20         for (t = lim[node]; t >= 0; --t)
21             for (v = 0; v <= lim[k]; ++v) {
22                 if (t-v-wei[k] >= 0)
23                     f[node][t] = max(f[node][t], f[node][t-v-wei[k]] + f[k][v]);
24             }
25     }
26     book[node] = true;
27     return;
28 }
29 
30 int main()
31 {
32     LL N, i, ans;
33     scanf("%lld", &N);
34     for (i = 1; i <= N; ++i) {
35         LL dad;
36         scanf("%lld%lld%lld%lld", &dad, &wei[i], &lim[i], &gain[i]);
37         if (L[dad]) R[i] = L[dad];
38         L[dad] = i;
39     }
40     diudiu(1);
41     ans = f[1][0];
42     for (i = 1; i <= lim[1]; ++i)
43         ans = max(ans, f[1][i]);
44     printf("%lld
", ans);
45     return 0;
46 }
E

题目

A减肥
时间限制 : 20000 MS   空间限制 : 65536 KB  SPJ
问题描述

发福的何老板决定要减肥了。今天何老板给自己安排了t分钟的运动时间来做俯卧撑。

在运动时间里,每分钟何老板有三种选择:休息、做一个俯卧撑、连做两个俯卧撑。

每分钟对应着一个热量消耗量v[i](实数),何老板在该分钟里做一个俯卧撑可以消耗v[i]卡路里的热量,连做两个俯卧撑可消耗v[i]^2卡路里的热量,但是如果何老板在某分钟内连做了两个俯卧撑,他会感觉非常累,因此下一分钟他必须休息。

何老板想在这t分钟的运动时间里尽可能多地消耗热量,以达到减肥的目的,问这t分钟何老板最大的热量消耗是多少?

输入格式

第一行一个整数t。
第二行,t个实数v[i]。

输出格式

一个实数,最大消耗的热量,保留四位小数。

样例输入 1

3
9 2 1

样例输出 1

82.0000

样例输入 2

10
-12 327 0.26 -0.12 0.22 65 20 0.11 0 -1

样例输出 2

111155.3300

提示

1<=t<=800000,-255.00<=v[i]<=255.00
计算结果不超过int
为避免精度差,建议使用double类型,注意scanf和printf在输入输出double时,应写成lf%,float才是f%

B射箭
时间限制 : 10000 MS   空间限制 : 165536 KB
问题描述

何老板是一名箭术爱好者,今天他又到箭馆里去玩射箭游戏。
游戏中,何老板有n(编号1到n)只箭,每只箭的杀伤力不同,何老板必须按编号由小到大的顺序射箭,也就是说如果他这次射出去了编号为x的箭,下一次他只能发射编号比x大的箭。每秒钟会有一只怪兽出现在屏幕上,一秒钟以后该怪兽会消失,不会再出现了。
游戏中会出现m(编号1到m)个怪兽,怪兽按编号1到m依次出现。每个怪兽都有一定的生命值,若当前出现的是一只生命值为y的怪兽,这时何老板用一只杀伤力为x的箭射中了它,那么这次何老板的得分是(x-y)分。
何老板一秒钟可以射出一支箭,且百发百中,现在已知每个怪兽的生命值,问何老板最多能得多少分?

输入格式

第一行,两个整数n和m,1<=n,m<=3000
第二行,n个空格间隔的整数,表示编号1到n的箭的杀伤力。
第三行,m个空格间隔的整数,表示编号1到m的怪兽的生命值。

输出格式

一行,一个整数,表示最大得分。

样例输入 1

4 5
8 9 3 10
10 12 4 5 6

样例输出 1

12

样例输入 2

10 15
10 22 16 14 29 22 7 23 29 6 
2 7 13 17 12 13 27 2 20 14 2 29 16 3 7 

样例输出 2

120

样例输入 3

5 7
11 10 9 0 6 
6 10 13 10 5 4 13 

样例输出 3

15

提示

数据范围:
0<=箭的杀伤力<=10000
0<=怪物的生命值<=10000

C钢铁侠
时间限制 : 10000 MS   空间限制 : 165536 KB
问题描述

何老板最近很钟意一款名为钢铁侠的飞行游戏。游戏中有n块木板悬浮在空中,不同的木板悬浮的高度可能不同,每块木板上都有一定的金币。
玩家可以任选一块木板作为钢铁侠飞行的起点,控制钢铁侠往右飞行。飞行时,钢铁侠会一直保持当前的飞行高度。当然,玩家可以选择让钢铁侠降落到比当前飞行高度低的木板上。每当钢铁侠降落到一块木板上,他就可以获得该木板上的金币。然后钢铁侠会以当前木板的高度继续往右飞行。
游戏中还有两种特殊的木板:
1.木板上有磁铁,只要钢铁侠从其上空经过便会被吸到该木板上,获得金币后以该木板的高度继续往右飞行(也就是经过时必须降落在该木板);
2.木板上有弹簧,如果钢铁侠选择降落在上面,获得金币的同时会被向上弹起一定的高度t(假如该木板高度为h,钢铁侠降落后继续往右飞行的高度为h+t);
现在何老板已知所有木板的信息,问他最多能得到多少金币?

输入格式

第一行,一个整数n
接下来n行,从左往右依次描述每块木板的情况。
第i行描述第i块木板,首先是三个整数h,g,v,其中h表示木板的高度,g表示该木板上金币的数量,v表示木板的种类。
v=0,表示这是一块普通木板,
v=1,表示这块木板上有磁铁,
v=2,表示这块木板有弹簧,接下来一个整数t,表示向上弹起的高度。

输出格式

一个整数,表示能够得到的最多金币数。

样例输入 1

7
14 25 0
1 15 0
12 20 2 20
5 21 0
20 18 1
27 28 0
23 30 0

样例输出 1

66

样例输入 2

10
26 17 0
2 4 2 28
2 11 0
12 24 2 27
21 27 1
26 3 0
28 1 2 9
10 12 0
14 3 1
3 13 1

样例输出 2

97

样例输入 3

7
7 29 2 29
18 26 0
11 9 0
21 16 1
1 7 0
25 5 0
29 28 2 25

样例输出 3

71

提示

样例1说明:
钢铁侠从1号板起飞,在3号和4号板降落。获得的金币为25+20+21=66
数据范围:
1<=n<=3000
1<=h<=50000
0<=g<=10000
1<=t<=50000

D出租
时间限制 : 10000 MS   空间限制 : 265536 KB
问题描述

明年1月到7月何老板将去环球旅行,在这期间,他打算把他在重庆的两套完全一样的房子租出去。现在有5个人想要租何老板的房子,他们的租期和愿意出的租金如下图所示:

租房者	租期(从第x月租到第y月)	愿意出的租金
甲	1月到2月                    	10
乙	4月到7月                 	20
丙	1月到3月	                    2
丁	3月到7月	                    3
茂	1月到6月	                    4


何老板想得到尽可能多的租金,他该把房子租给哪些人呢?

输入格式

第1行:两个正整数,t表示何老板的房子从1月到t月可供出租,n表示租房者的人数
接下来n行:每行三个正整数t1,t2,w, 分别表示第i个租房者的开始时间、结束时间和愿意出的租金隔。

输出格式

只有1行: 1个整数,表示能得到的最大租金。

样例输入 1

7 5
1 2 10
4 7 20
1 3 2
3 7 3
1 6 4

样例输出 1

35

样例输入 2

288 8
6 9 66
28 185 52
146 173 34
129 225 35
133 155 90
138 175 57
64 115 65
223 260 59

样例输出 2

337

样例输入 3

24 10
12 20 81
4 4 17
11 14 60
1 20 13
3 3 70
10 17 31
2 2 47
7 11 27
21 21 86
4 9 76

样例输出 3

464

提示

样例1是这样实现的:第一套房子租给第1和第4个人,第二套房子租给第2和第3个人。这样最大的租金就为10+20+2+3=35。

对于30%的数据:1<=t<=500 1<=n<=15 1<=w<=100 1<=t1<=t2<=t
对于100%的数据:1<=t<=500 1<=n<=100 1<=w<=100 1<=t1<=t2<=t
这里假设一年至少有t个月

 
E吊灯
时间限制 : 10000 MS   空间限制 : 165536 KB
问题描述

JYY为了省钱,从一个不知名的小吊灯商那里购来一批吊灯,但是他发现并不能直接把这吊灯挂起来:只有一个吊灯能挂在天花板上,而其他所有的灯只能固定的挂在某一个别的吊灯上(可恶的奸商~…好在没有什么吊灯A只能挂在吊灯B上,而吊灯B却也只能挂在吊灯A上的情况)。众所周知,每个吊灯都有其本身的重量,也有一定的承受能力,并且,不是所有的吊灯亮度都一样的。JYY希望能够选出其中的一些吊灯吊起来,每个灯下面所吊的都在其重力承受范围之内,且使所有灯的亮度之和最大,JYY要求你帮他解决这个问题。

输入格式

共包含n+1行:
第一行一个整数n。
以后的n行每行四个整数t、w、p、q,
第i+1行的t(t<i)表示第i盏灯只能吊在第t盏灯下面,w表示第i盏灯的重量,p表示第i盏灯所能吊起的最大重力,q表示第i盏灯的亮度。
注意:第1盏灯的t=0。

输出格式

一行,一个整数表示最大的亮度。

样例输入 1

5
0 100 100 100
1 50 50 50
1 50 50 50
2 30 50 60
2 25 50 50

样例输出 1

210

样例输入 2

5
0 20 20 3611
1 16 6 3291
1 12 4 8192
1 3 15 3886
3 14 1 4222

样例输出 2

15689

提示

0≤n≤400
0≤w≤200
0≤p≤200
0≤q≤10000

原文地址:https://www.cnblogs.com/ghcred/p/8631598.html