题目链接: http://codeforces.com/problemset/problem/799/C

题意: 有c, d两种货币, 有 n 个货物, 可以用 c 货币或者 d 货币购买, 现在需要买两件货物, 问购买的货物的美丽值最大可为多少.

思路: 只买两件货物, 那么总共有 3 总可能, 买一件 c 一件 d, 买两件 c 或者买两件 d . 取他们的最大值即可.

可以给 c 货物和 d 货物按 p 升序排列, 那么对于买一件 c 一件 d 的情况, 只需要遍历一下 c 货物 和 d 货物, 分别取能买到的最大 b 值即可.

对于买两件 c 的情况,  用 vis[k] 存储当前 k 个 c 货币最大可买到的 b 值. 那么可以遍历c 货物的同时更新 vis 数组, 即对于当前 i , vis[k] 存储 [0, i) 中 k 可以买到的最大价值.

那么对于每一个 i , 匹配一下 vis[c - gel_c[i].p] 即可, 然后维护一下 gel_c[i].b + vis[c - gel_c[i].p] 的最大值即可.

对于选两件 d 的情况, 和选两个 c 的情况处理方法相同.

代码:

 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std; const int MAXN = 1e5 + ;
struct node{
int b, p;
}gel_c[MAXN], gel_d[MAXN]; int vis[MAXN], tag[MAXN]; bool cmp(node x, node y){
return x.p < y.p;
} int main(void){
char op[];
int n, c, d, indx_c = , indx_d = , ans = ; scanf("%d%d%d", &n, &c, &d);
for(int i = ; i < n; i++){
int b, p;
scanf("%d%d%s", &b, &p, op);
if(op[] == 'C'){
gel_c[indx_c].b = b;
gel_c[indx_c++].p = p;
}else{
gel_d[indx_d].b = b;
gel_d[indx_d++].p = p;
}
} sort(gel_c, gel_c + indx_c, cmp);
sort(gel_d, gel_d + indx_d, cmp); int cnt1 = , cnt2 = , pos = ;
for(int i = ; i < indx_c; i++){
if(gel_c[i].p > c) break;
cnt1 = max(cnt1, gel_c[i].b);
}
for(int i = ; i < indx_d; i++){
if(gel_d[i].p > d) break;
cnt2 = max(cnt2, gel_d[i].b);
}
if(cnt1 && cnt2) ans = cnt1 + cnt2; cnt1 = cnt2 = ;
for(int i = ; i < indx_c; i++){
int gg = c - gel_c[i].p;
if(gg <= ) break;
int cc = upper_bound(tag, tag + pos, gg) - tag;
if(cc == && i != ) break;
cc = tag[cc - ];
if(vis[cc]) ans = max(ans, gel_c[i].b + vis[cc]);
vis[gel_c[i].p] = max(cnt1, gel_c[i].b);
tag[pos++] = gel_c[i].p;
cnt1 = max(cnt1, gel_c[i].b);
} pos = ;
for(int i = ; i < indx_d; i++){
int gg = d - gel_d[i].p;
if(gg <= ) break;
int cc = upper_bound(tag, tag + pos, gg) - tag;
if(cc == && i != ) break;
cc = tag[cc - ];
if(vis[cc]) ans = max(ans, gel_d[i].b + vis[cc]);
vis[gel_d[i].p] = max(cnt2, gel_d[i].b);
tag[pos++] = gel_d[i].p;
cnt2 = max(cnt2, gel_d[i].b);
}
printf("%d\n", ans);
return ;
}

799C(xjb)的更多相关文章

  1. 程设大作业xjb写——魔方复原

    鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...

  2. hdu_5881_Tea(xjb猜)

    题目链接:hdu_5881_Tea 题意: 有一壶水, 体积在 L 和 R 之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不 ...

  3. hdu_5873_Football Games(xjb搞)

    题目链接:hdu_5873_Football Games 题意: 有n个队,每个队都会给其他队打一场,赢一场得2分,平局得一分,输了不得分,然后给你全部比赛结束后的得分,问你是否有假分 题解: 可以知 ...

  4. hdu_5761_Rower Bo(xjb猜公式)

    题目链接:hdu_5761_Rower Bo 题意: 让你求一个物理问题 题解: xjb猜公式,由题目样例可得,答案为8/7,然后我们可以xjb猜出公式为v1*a/(v1*v1-v2*v2),然后特判 ...

  5. 51nod1276(xjb)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1276 题意:中文题诶- 思路:xjb 通过画图可以发现对于当前 ...

  6. 隔壁信概大作业xjb写——同化棋ATAXX

    话说泥萌北大信科啊,助教是有多懒...去年黑白棋今年同化棋,顺带打ai都不用自己写标程... 好吧..我知道泥萌重点在各种sb的辅助操作上..什么悲剧的可以随时暂停载入...有毒吧 [据说泥萌上课没讲 ...

  7. [HDU5902]GCD is Funny(xjb搞)

    题意:n个数每次选三个数删除,取其中两个数将gcd放回去两次,问最后剩的数可能是多少 分析:考虑最优情况: 先拿出三个数,留下两个x,x  再来一个y,(x,x,y)我们可以删去一个x,留下两个gcd ...

  8. hdu_5927_Auxiliary Set(xjb搞)

    题目链接:hdu_5927_Auxiliary Set 题意: 给一棵n个节点的树,最开始全部都是重点,现在有q个询问,每次给你一些轻点,并叫你输出整棵树的重点数量, 轻点可能会变为重点,如果这个轻点 ...

  9. hdu_5813_Elegant Construction(xjb搞)

    题目链接:hdu_5813_Elegant Construction 题意: 给你n个点,每个点要可以到达ai个点,可以直接可以间接,不能有环,问是否可行,如果可行就任选一种方式连接,并输出连接的边数 ...

随机推荐

  1. Php处理大文件-分割和合并

    分割文件 /* * 分割文件 * 默认大小 2M=10485760/5 */ function file_split($file,$block_size=10485760/5) { $block_in ...

  2. Python基础-处理json函数

    #json是一种通用的数据类型,所有的语言都认识#json是一个字符串,json串里面都得是双引号,主要是这四个函数 #dump#dumps#load#loads import jsonnames = ...

  3. hadoop_学习_00_资源帖

    一.精品 1.虚无境的博客 随笔分类 - hadoop 二.参考资料 1.大数据学习之路(持续更新中...) 2.Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0 ...

  4. SpringBoot_异常_01_Caused by: java.lang.BootstrapMethodError: java.lang.NoSuchMethodError

    一.异常信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonB ...

  5. Javascript-- jQuery DOM篇(二)

    DOM拷贝clone() 克隆节点是DOM的常见操作,jQuery提供一个clone方法,专门用于处理dom的克隆 .clone()方法深度 复制所有匹配的元素集合,包括所有匹配元素.匹配元素的下级元 ...

  6. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

  7. C++ 值传递、址传递、引用传递

    一.值传递   int func(int p) 值传递会在栈中开辟一块空间 p,使得p和实参的a 同值. 此时你在函数func里面对p进行任何操作都不会对原值a产生任何影响.因为a 和p本就就是两个变 ...

  8. 转载 解决Android与服务器交互大容量数据问题

    对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想.在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题.本文根据笔者的一个项目实战经验出发,解决 ...

  9. [冬令营模拟]GTSG2018

    上学期没有去 GTSG,于是今天老师让我们来做一下 GTSG2018 Day1 & Day3 Day1 在上午当成一场考试来搞了,Day3 由于锅太多而且 T3 玄学而被放到下午自学... 上 ...

  10. NOIp2018集训test-10-16 (bike day2)

    “毕姥爷:今天的题好简单啊,你们怎么考得这么烂啊,如果是noip你们就凉透了啊“ 今天的题难度应该是3.2.1递减的,但是我不知道哪根筋没搭对,平时我最多1h多就弃题了,今天硬生生写了2h20min的 ...