C. Fountains
\(整体思路没错,但是我貌似太麻烦了.......\)
\(分情况讨论\)
\(Ⅰ.coin和diamond各选一个物品,这个简单\)
\(Ⅱ.在coin中选两个或者在diamond选两个\)
\(开始我想着枚举一个物品找另一个物品肯定超时\)
\(那我们可以直接预处理sumn[i]表示花费i时的最大收益,但是这样做可能这个最大收益就是枚举物品本身(重复了)\)
\(\color{Red}{至此有三种解决方案}\)
\(Ⅰ.\)
\(那我们额外记录sumn[i]时选的物品是谁,假如就是枚举的物品本身我们再对这个物品单独求解\)
\(Ⅱ.\)
\(开二维数组sumn[i][2]同时把次大值也装进去,如果余额大于等于枚举的商品且sumn[rest][0]==枚举商品价值\)
\(那么我们就取次小值,因为此时sumn[rest][0]装的值是枚举商品\)
\(Ⅲ.\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=100009;
struct p{
int v,w;
}a[maxn],b[maxn];
int cnt1,cnt2;
int vis1[100009],vis2[100009];//储存物品花费i时美感最大值
int sumn1[100009],sumn2[100009],ans;
int num1[maxn],num2[maxn],vnum1[maxn],vnum2[maxn];
int main()
{
int n,m1,m2;
cin>>n>>m1>>m2;
for(int i=1;i<=n;i++)
{
int l,r;char s;
cin>>l>>r>>s;
if(s=='C')
{
if(vis1[r]<l) vnum1[r]=cnt1+1;
a[++cnt1].v=l,a[cnt1].w=r,vis1[r]=max(vis1[r],l);
}
else
{
if(vis2[r]<l) vnum2[r]=cnt2+1;
b[++cnt2].v=l,b[cnt2].w=r,vis2[r]=max(vis2[r],l);
}
}
int maxn1=-1,maxn2=-1;
for(int i=1;i<=100000;i++)
{
if(sumn1[i-1]<vis1[i]) num1[i]=vnum1[i];
else num1[i]=num1[i-1];
if(sumn2[i-1]<vis2[i]) num2[i]=vnum2[i];
else num2[i]=num2[i-1];
sumn1[i]=max(sumn1[i-1],vis1[i]);
sumn2[i]=max(sumn2[i-1],vis2[i]);
}
for(int i=1;i<=cnt1;i++)
if(a[i].w<=m1)
{
maxn1=max(maxn1,a[i].v);//买得起
if(num1[m1-a[i].w]==i)//可能存在相等(选自己)
{
int temp=-1;
for(int j=1;j<=cnt1;j++)
if(i!=j&&a[j].w<=m1-a[i].w)
temp=max(temp,a[j].v);
if(temp==-1) continue;
ans=max(ans,temp+a[i].v);
}
else if(sumn1[m1-a[i].w]!=0)
ans=max(ans,a[i].v+sumn1[m1-a[i].w]);
}
for(int i=1;i<=cnt2;i++)
if(b[i].w<=m2)
{
maxn2=max(maxn2,b[i].v);
if(num2[m2-b[i].w]==i)
{
int temp=-1;
for(int j=1;j<=cnt2;j++)
if(i!=j&&b[j].w<=m2-b[i].w)
temp=max(temp,b[j].v);
if(temp==-1) continue;
ans=max(ans,temp+b[i].v);
}
else if(sumn2[m2-b[i].w]!=0)
ans=max(ans,b[i].v+sumn2[m2-b[i].w]);
}
if(maxn1!=-1&&maxn2!=-1) ans=max(ans,maxn1+maxn2);
cout<<ans;
}
C. Fountains的更多相关文章
- Fountains(非线段树版(主要是不太会用))
Arkady plays Gardenscapes a lot. Arkady wants to build two new fountains. There are n available foun ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 【树状数组维护区间最大值】
题目传送门:http://codeforces.com/contest/799/problem/C C. Fountains time limit per test 2 seconds memory ...
- codeforces 799C Fountains
C. Fountains time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 树状数组 Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains
C. Fountains time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- codeforces 799 C. Fountains(二分+思维)
题目链接:http://codeforces.com/contest/799/problem/C 题意:要求造2座fountains,可以用钻石,也可以用硬币来造,但是能用的钻石有限,硬币也有限,问能 ...
- CodeForce-799C Fountains (记忆化DP)
Fountains CodeForces - 799C 某土豪想要造两座喷泉.现在有 n 个造喷泉的方案,我们已知每个方案的价格以及美观度.有两种合法的货币:金币和钻石.这两种货币之间不能以任何方式转 ...
- Codeforces Round #413, rated, Div. 1 + Div. 2 C. Fountains(贪心 or 树状数组)
http://codeforces.com/contest/799/problem/C 题意: 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...
- C.Fountains(Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)+线段树+RMQ)
题目链接:http://codeforces.com/contest/799/problem/C 题目: 题意: 给你n种喷泉的价格和漂亮值,这n种喷泉题目指定用钻石或现金支付(分别用D和C表示),C ...
- 【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains
分几种情况讨论: (1)仅用C或D买两个 ①买两个代价相同的(实际不同)(排个序) ②买两个代价不同的(因为买两个代价相同的情况已经考虑过了,所以此时对于同一个代价,只需要保存美丽度最高的喷泉即可)( ...
- [#413c] Fountains
http://codeforces.com/contest/799/problem/C 解题关键:树状数组取最大值,注意先搜索,后加入,此种情况可以取出最大值. 为什么可以取到最大值? 1.当分别用两 ...
随机推荐
- Powershell抓取网页信息
一般经常使用invoke-restmethod和invoke-webrequest这两个命令来获取网页信息,如果对象格式是json或者xml会更容易 1.invoke-restmethod 我们可以用 ...
- typename 关键字
1.class关键字的同义词 template <typename T> const T& max(const T& x, const T& y) { return ...
- Pormetheus(一)
(1)Prometheus由来普罗米修斯的灵感来自于谷歌的Borgmon.它最初是由马特·t·普劳德(Matt T. Proud)作为一个研究项目开发的,普劳德曾是谷歌(google)的一名雇员.在普 ...
- three.js中让模型自动居中的代码如下:
//load_Model为需要居中的3D模型 //原理是通过boundingBoxHelper 来计算模型的大小范围 var hex = 0xff0000; var MD_Length,MD_Widt ...
- Serval and Parenthesis Sequence CodeForces - 1153C
题目大意:一个字符串只含有? ( ),?可以变成 ) 或者 ( ,将字符串中所有的?变成) 或者 ( 使得字符串合法. 合法就是让括号配对,并且不可以提前结束比如:()()这样是不合法的. 题解:既然 ...
- C - Mind Control CodeForces - 1291C
菜到家了,题意都读不懂. 题目大意: 总共有n个人和n个数字 n个人拍成一队,n个数字也是有顺序的 你排在第m个位置 按照顺序的每个人可以拿走这个序列中的第一个数字或者最后一个数字 你可以在所有人操作 ...
- Go gRPC进阶-proto数据验证(九)
前言 上篇介绍了go-grpc-middleware的grpc_zap.grpc_auth和grpc_recovery使用,本篇将介绍grpc_validator,它可以对gRPC数据的输入和输出进行 ...
- Spring Cloud Gateway+Nacos,yml+properties两种配置文件方式搭建网关服务
写在前面 网关的作用不在此赘述,举个最常用的例子,我们搭建了微服务,前端调用各服务接口时,由于各服务接口不一样,如果让前端同事分别调用,前端同事会疯的.而网关就可以解决这个问题,网关屏蔽了各业务服务的 ...
- Java锁之自旋锁
Java锁之自旋锁 自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU 原来提到的比较并交换,底层 ...
- 编程语言千千万,为什么学习Python的占一半?
如果让你从数百种的编程语言中选择一个入门语言?你会选择哪一个? 是应用率最高.长期霸占排行榜的常青藤 Java?是易于上手,难以精通的 C?还是在游戏和工具领域仍占主流地位的 C++?亦或是占据 Wi ...