zoukankan      html  css  js  c++  java
  • 动规-某动规专练 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

  • 相关阅读:
    SSLOJ 1338.逃亡路径
    文件上传与下载
    TCP协议和UDP协议
    DWR推技术在开发中需要注意的ScriptSession问题
    页面缓存-freemarker静态处理
    springMVC的工作流程
    hibernate的工作流程
    Struts2框架的大致流程
    mybatis中的多表查询
    传值乱码解决方案
  • 原文地址:https://www.cnblogs.com/ghcred/p/8631598.html
Copyright © 2011-2022 走看看