HDU 1574 RP问题

题目链接

中文题 , 题意一目了然。

将a b c 进行处理一下。

当a > 0 时:

需要当前RP小于等于b才能触发此事件 , 触发此事件时 , 人品增加a , 获益值增加c(此时c为负)

当a < 0 时

需要当前RP大于等于b才能触发此事件 , 触发此事件时 , 人品增加a(此时a为负) , 获益值增加c

那么 可以设dp[i]为RP为i时,获得的最大获益值。

因为b可能为负(一个人的RP可能为负) , 所以对b进行小小的处理 , 增加10000 因为 b >= -10000 加上10000之后就变0了

状态转移方程为:

dp[i+a] = max(dp[i] + c , dp[i+a]);

0-1背包 , 所以要注意循环顺序 , 不要做成了完全背包了。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <iostream>
 6 #include <map>
 7 #include <list>
 8 #include <queue>
 9 #include <stack>
10 #include <string>
11 #include <algorithm>
12 #include <iterator>
13 using namespace std;
14 #define MAXN 20020
15 #define INF 0x3f3f3f3f
16 #define MOD 1000000007
17 #define eps 1e-6
18 #define LL long long
19 bool vis[MAXN];
20 int dp[MAXN];
21 int T,n;
22 void init()
23 {
24     memset(dp , 0 , sizeof(dp));
25     memset(vis , false , sizeof(vis));
26     dp[10000] = 0;
27     vis[10000] = true;
28 }
29 void read_cal()
30 {
31     int a,b,c;
32     init();
33     scanf("%d",&n);
34     for(int i = 0; i < n; i ++)
35     {
36         scanf("%d %d %d",&a,&b,&c);
37         b += 10000;
38         if(a >= 0 )
39         {
40             for(int j = b; j >= 0; j --)
41                 if(vis[j])
42                 {
43                     if(!vis[j+a])
44                     {
45                         vis[j+a] = true;
46                         dp[j+a] = dp[j] + c;
47                     }
48                     else
49                         dp[j+a] = max(dp[j] + c , dp[j + a]);
50                 }
51         }
52         else if(a < 0)
53         {
54             for(int j = b; j < MAXN; j ++)
55                 if(vis[j])
56                 {
57                     if(!vis[j+a])
58                     {
59                         vis[j+a] = true;
60                         dp[j+a] = dp[j] + c;
61                     }
62                     else
63                         dp[j+a] = max(dp[j] + c , dp[j+a]);
64                 }
65         }
66     }
67     int ans = -INF;
68     for(int i = 0; i < MAXN; i ++)
69         if(vis[i]) ans = max(ans , dp[i]);
70     printf("%d\n",ans);
71 }
72
73 int main()
74 {
75     scanf("%d",&T);
76     while(T--)
77     {
78         read_cal();
79     }
80     return 0;
81 }

时间: 2024-10-10 15:58:51

HDU 1574 RP问题的相关文章

hdu 1574 RP问题 01背包的变形

hdu 1574 RP问题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1574 分析:01背包的变形. RP可能为负,所以这里分两种情况处理一下就好. 初始化要注意. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int

!HDU 1574 RP-dp-(重点在状态确定)

题意:有n件事,每件事若发生有两种情况,增加RP为a,但是收益会减少c:减少R为a,收益会增加c.每件事能够发生的前提是小于等于或者大于等于门限值b.求最大收益. 分析:这题我没找到状态,所以就不会了.又陷入了固定思维,用每件事来作为状态,然后发现找不到转移方程.应该用RP值来作为状态,状态转移就是从满足门限的RP区间的状态转移到当前状态.dp[k]表示RP值为k时的最大收益,方程:dp[i]=max(dp[i+a],dp[i]+c).这个方程是在一个循环里求的,循环是用来遍历满足门限的RP区间

HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9267    Accepted Submission(s): 2668 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

HDU分类

模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 1049 1050 1057 1062 1063 1064 1070 1073 1075 1082 1083 1084 1088 1106 1107 1113 1117 1119 1128 1129 1144 1148 1157 1161 1170 1172 1177 1197 1200 1201 12

HDU 1811

Rank of Tetris Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为 了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排 名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排.终于,Lele要开始行动了,对N个人进行排名.为了方便起见,每

HDU 4417 划分树+二分

题意:有n个数,m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质,二分查找在区间[l,r]小于等于k的个数. 如果在区间第 i 大的数tmp>k,则往下找,如果tmp<k,往上找. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #incl

HDU 3873 Invade the Mars(带限制条件的Dijkstra)

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路: 军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间).则进入该城市的最少时间为max(达到该城市的最少时间,到达保护该城市的所有城市的最大时间). 用num[i]标记第i个城市被保护的数目,只有当该点被保护的数目为0时,才能入S集合,从而优化到其他点的时间.当前进入S集合的城市,遍历它所保护的城市,num[i]减一,记录下被保护的城市解除保护所需的最长

HDU 1811:Rank of Tetris(并查集+拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按

HDU 3416 Marriage Match IV

Marriage Match IV Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 3416 64-bit integer IO format: %I64d      Java class name: Main Do not sincere non-interference.Like that show, now starvae also take part in