2017浙江理工大学校赛H题
2017-03-22 21:29
295 查看
4273: 玩具
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 779 Solved: 157
Description
商店有n个玩具,第i个玩具有价格a[i]和快乐值b[i]。有一天,小王来到商店想买一些玩具,商店老板告诉他,如果他买的所有玩具的位置是连续的,那么老板答应小王购买的所有玩具中某一个可以免费。小王接受老板的提议,他现在有零花钱k可以用来买玩具,那么他能获得的最大的快乐值是多少。
Input
第一行给测试总数T(T <= 100),接下来有T组测试数据。
每组测试数据第一行有两个数字n(1 <= n <= 5000)和k(0 <= k <= 1000000000)。
第二行有n个数字,第i个数字表示第i个玩具的价格a[i](1 <= a[i] <= 1000000)。
第三行有n个数字,第i个数字表示第i个玩具的快乐值b[i](1 <= b[i] <= 1000000)。
Output
每组测试输出小王能获得的最大快乐值。
Sample Input
3
5 14
1 2 3 4 5
5 4 3 2 1
3 1
100 1000 10000
100 1000 10000
1 0
1000000
1000000
Sample Output
15
10000
1000000
HINT
题意:中文题面,自己看。
解题思路:给人的第一感觉是背包,还是超大背包,加贪心,刚开始题目意思理解错了,以为是既可以连续,又可以不连续,然后就GG,小伙伴们看见了这句话没有“小王接受老板的提议”,这句话的意思就是一定要连续,那么要连续的话就简单多了,处理出区间最大值就行,然后枚举区间左端点,二分区间右端点,取最大值就行,至于区间最大值,可以用线段树,rmq,应该都行,我这里用的是rmq。
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 779 Solved: 157
Description
商店有n个玩具,第i个玩具有价格a[i]和快乐值b[i]。有一天,小王来到商店想买一些玩具,商店老板告诉他,如果他买的所有玩具的位置是连续的,那么老板答应小王购买的所有玩具中某一个可以免费。小王接受老板的提议,他现在有零花钱k可以用来买玩具,那么他能获得的最大的快乐值是多少。
Input
第一行给测试总数T(T <= 100),接下来有T组测试数据。
每组测试数据第一行有两个数字n(1 <= n <= 5000)和k(0 <= k <= 1000000000)。
第二行有n个数字,第i个数字表示第i个玩具的价格a[i](1 <= a[i] <= 1000000)。
第三行有n个数字,第i个数字表示第i个玩具的快乐值b[i](1 <= b[i] <= 1000000)。
Output
每组测试输出小王能获得的最大快乐值。
Sample Input
3
5 14
1 2 3 4 5
5 4 3 2 1
3 1
100 1000 10000
100 1000 10000
1 0
1000000
1000000
Sample Output
15
10000
1000000
HINT
题意:中文题面,自己看。
解题思路:给人的第一感觉是背包,还是超大背包,加贪心,刚开始题目意思理解错了,以为是既可以连续,又可以不连续,然后就GG,小伙伴们看见了这句话没有“小王接受老板的提议”,这句话的意思就是一定要连续,那么要连续的话就简单多了,处理出区间最大值就行,然后枚举区间左端点,二分区间右端点,取最大值就行,至于区间最大值,可以用线段树,rmq,应该都行,我这里用的是rmq。
#include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int maxn = 5e3 + 10; int n; ll k; ll a[maxn]; ll b[maxn]; ll dp[maxn][20]; int Log[maxn]; ll suma[maxn]; ll sumb[maxn]; void initRmq() { Log[0] = -1; memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i++) { Log[i] = (i&(i - 1)) == 0?Log[i - 1] + 1:Log[i - 1]; dp[i][0] = a[i]; } for(int j = 1; (1<<j) <= n; j++) { for(int i = 1; i <= n&&(i + (1<<j) - 1) <= n; i++) { dp[i][j] = max(dp[i][j - 1],dp[i + (1<<(j - 1))][j - 1]); } } } ll rmq(int l,int r) { int k = Log[r - l + 1]; return max(dp[l][k],dp[r - (1<<k) + 1][k]); } bool ok(int i,int x) { ll ans = rmq(i,x); if(suma[x] - suma[i - 1] - ans <= k) return true; else return false; } int main() { int T; scanf("%d",&T); while(T--) { memset(suma,0,sizeof(suma)); memset(sumb,0,sizeof(sumb)); scanf("%d%lld",&n,&k); for(int i = 1; i <= n; i++) { scanf("%lld",&a[i]); suma[i] = suma[i - 1] + a[i]; } for(int i = 1; i <= n; i++) { scanf("%lld",&b[i]); sumb[i] = sumb[i - 1] + b[i]; } initRmq(); ll Max = 0; int l = 1; ll sum = 0; ll value = 0; for(int i = 1; i <= n; i++) { int l = i; int r = n; int result = -1; while(l <= r) { int mid = (l + r)>>1; if(ok(i,mid)) { result = mid; l = mid + 1; } else r = mid - 1; } if(result != -1) Max = max(Max,sumb[result] - sumb[i - 1]); } printf("%lld\n",Max); } return 0; } /************************************************************** Problem: 4273 User: creatorx Language: C++ Result: Accepted Time:100 ms Memory:2428 kb ****************************************************************/
相关文章推荐
- 2017浙江理工大学校赛A题
- 2017浙江理工大学校赛D题
- 2017浙江理工大学校赛E题
- HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)
- HAUT 1261 地狱飞龙(数值积分)(河南工业大学2017校赛)
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- 2017浙工大之江学院校赛 C 组合数学+思维
- 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
- ZCMU2016: 不存在的树 (2017浙江中医药校赛) (树链剖分)
- 2017武汉大学校赛网络预选赛e题
- HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)
- HAUT 1261 地狱飞龙(数值积分)(河南工业大学2017校赛)
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- 北工大2017校赛 1101:要打车的FanZzz
- 2017 多校赛6 Gameia hdu 6105
- 2017浙江理工校赛 A、D、I 待补完
- 2017哈理工校赛部分题解
- 2017武汉大学校赛网络预选赛g题
- 浙江理工大学校赛 JugHard 4216(gcd)
- HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)