博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1574 RP问题
阅读量:4593 次
发布时间:2019-06-09

本文共 1489 字,大约阅读时间需要 4 分钟。

如果说难的话,难就难在对阶段的划分。

这又是一道对值域空间进行分段的题目。

因为rp有正有负,所以将整个数组向右平移10000个单位长度

l和r分别是rp可能的最小值

因为b是“门槛”,所以如果

发生好事(即c>0)循环就从b到r

发生坏事(即c<0)循环从l到b

然后从左到右找出最大值即可

1 //#define LOCAL 2 #include 
3 #include
4 #include
5 #include
6 using namespace std; 7 8 const int INF = -999999; 9 const int maxn = 20000 + 10;10 int rp[maxn];11 12 int main(void)13 {14 #ifdef LOCAL15 freopen("1574in.txt", "r", stdin);16 #endif17 18 int N;19 scanf("%d", &N);20 while(N--)21 {22 int n;23 scanf("%d", &n);24 for(int i = 0; i < maxn; ++i)25 rp[i] = INF;26 int l, r;27 l = r = 10000;28 rp[l] = 0;29 30 while(n--)31 {32 int a, b, c;33 scanf("%d%d%d", &a, &b, &c);34 b += 10000;35 36 if(a < 0)37 {38 for(int i = b; i <= r; ++i)39 rp[i+a] = max(rp[i+a], rp[i]+c);40 l += a;41 } 42 else43 {44 for(int i = b; i >= l; --i)45 rp[i+a] = max(rp[i+a], rp[i]+c);46 r += a;47 }48 }49 int ans = 0;50 for(int i = l; i <= r; ++i)51 ans = max(ans, rp[i]);52 printf("%d\n", ans);53 }54 return 0;55 }
代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3859344.html

你可能感兴趣的文章
EntityFramework Core2.0 多对多关系配置
查看>>
grok 正则解析日志例子<1>
查看>>
Linux 内核中 likely 与 unlikely 的宏定义解析
查看>>
课堂作业4
查看>>
.NET SOCKET通信编程
查看>>
linux内核--虚拟文件系统【转】
查看>>
Numpy学习笔记(四)
查看>>
巨蟒python全栈开发-第11阶段 ansible_project7
查看>>
面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法...
查看>>
Android系统刷机成功后网络信号显示“无服务”修正
查看>>
深圳Uber优步司机奖励政策(12月28日到1月3日)
查看>>
文本框样式大全
查看>>
shell按行合并文件
查看>>
leetcode总结
查看>>
[BZOJ 1095] [ZJOI 2007]Hide 捉迷藏
查看>>
分层测试_基本思想
查看>>
HihoCoder - 1139
查看>>
Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
查看>>
初次使用Mybatis配置出现错误待解决
查看>>
linux中使用vi 打开文件时,能显示行号
查看>>