动规-某动规专练 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\n", max(max(f[t&1][0], f[t&1][1]), f[t&1][2])); 20 return 0; 21 }
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 }
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\n", ans); 33 return 0; 34 }
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\n", 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 }
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\n", ans); 45 return 0; 46 }
题目
A减肥 | |
|
问题描述
发福的何老板决定要减肥了。今天何老板给自己安排了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射箭 | |
|
问题描述
何老板是一名箭术爱好者,今天他又到箭馆里去玩射箭游戏。
游戏中,何老板有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钢铁侠 | |
|
问题描述
何老板最近很钟意一款名为钢铁侠的飞行游戏。游戏中有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出租 | |
|
问题描述
明年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吊灯 | |
|
问题描述
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