Fountains

CodeForces - 799C

某土豪想要造两座喷泉。现在有 n 个造喷泉的方案,我们已知每个方案的价格以及美观度。有两种合法的货币:金币和钻石。这两种货币之间不能以任何方式转换。

找出一种合法方案使得两座喷泉的美观度和最大。

Input

第一行包含 3 个整数 n, cd (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 000) — 表示造喷泉的方案数,金币的数量和钻石的数量。

之后 n 行描述每一种建造喷泉的方案。每行包含两个整数 bipi (1 ≤ bi, pi ≤ 100 000) — 分别表示第 i 个喷泉的美观度和价格,之后一个字符"C" 或 "D", 表示这个价格使用金币还是钻石描述的。

Output

输出两个美观度最大的喷泉的美观度和。如果没有合法方案,输出 0.

Example

Input
3 7 6
10 8 C
4 3 C
5 6 D
Output
9
Input
2 4 5
2 5 C
2 1 D
Output
0
Input
3 10 10
5 5 C
5 5 C
10 11 D
Output
10

Note

第一个样例中造第2个喷泉,美观度为 4, 价格为 3 金币。第一个喷泉没有足够的金币来造。同时还造第3个喷泉,美观度为 5 ,价格为 6 钻石。那么总美观度为 9。

第二个样例中没有合法方案。

可以预处理出

pre1[N][2]

表示花费N个金币,能够获得的最大美丽值和次小美丽值;

然后对以下3种情况枚举其中的一个;

一.

两个商品都是金币买的

则枚举其中一个商品是哪一个;

然后看看余额还剩多少->rest;

直接获取pre1[rest][0]

如果枚举的商品的价格<=rest且pre1[rest][0]和这个枚举的商品的美丽值一样

就取pre1[rest][1];即次小值;

二.

两个商品都是钻石买的,同上

三.

一个商品是钻石买的,另外一个是金币买的,各自单独找最大值;

#include <bits/stdc++.h>
#define rep1(i,x,y) for(int i=x;i<=y;i++)
#define rep2(i,x,y) for(int i=y;i>=x;i--)
#define pb push_back
#define long long ll
using namespace std;
const int N=2e5+100; struct node
{
int b;//beauty
int p;//price
int id;
};
vector<int> g[2][N];//the beauty of two types fountain from each price
int bo[2][N][2];
int n,c,d;
node a[N];
int main()
{
ios_base::sync_with_stdio(0);
cin>>n>>c>>d;
char s[3];
rep1(i,1,n)
{
cin>>a[i].b>>a[i].p;
cin>>s;
a[i].id=(s[0]=='C') ? 0:1;
g[a[i].id][a[i].p].pb(a[i].b);
}
rep1(k,0,1)
{
rep1(i,1,100000)
{
bo[k][i][1]=bo[k][i-1][1];//DP
bo[k][i][0]=bo[k][i-1][0];//DP
int len=g[k][i].size();
rep1(j,0,len-1)
{
if(g[k][i][j]>bo[k][i][0])
{//g[k(*id)][i(*price)][j(*beauty)]
bo[k][i][1]=bo[k][i][0];
bo[k][i][0]=g[k][i][j];
//bo[k][i][0] find the best beauty and
//bo[k][i][0] the second beauty
//of fountains in the same price by coins
//(or diamonds,depends on "k")
}
else if(g[k][i][j]>bo[k][i][1])
bo[k][i][1]=g[k][i][j];
}
}
}
//all coins
int ans=0;
rep1(i,1,n)
if (a[i].id==0)
{
int t1 = a[i].b,t2 = a[i].p;
int rest = c-t2;
if (rest<=0) continue;
int t3 = bo[0][rest][0];
if (t2<=rest && t1==t3)
t3 = bo[0][rest][1];
if (t3<=0) continue;
ans = max(ans,t1+t3);
}
//all diamonds
rep1(i,1,n)
if (a[i].id==1)
{
int t1 = a[i].b,t2 = a[i].p;
int rest = d-t2;
if (rest<=0) continue;
int t3 = bo[1][rest][0];
if (t2<=rest && t1==t3)
t3 = bo[1][rest][1];
if (t3<=0) continue;
ans = max(ans,t1+t3);
}
//half coin half diamond
rep1(i,1,n)
{
int t1 = a[i].b,t2 = a[i].p;
int rest,t3;
if (a[i].id==0)
{
rest = d;
if (t2>c) continue;
}
else
{
rest = c;
if (t2>d) continue;
}
if (rest<=0) continue;
t3 = bo[1-a[i].id][rest][0];
if (t3<=0) continue;
ans = max(ans,t1+t3);
}
cout<<ans<<endl;
return 0;
}

CodeForce-799C Fountains (记忆化DP)的更多相关文章

  1. Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  2. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  3. cf835(预处理 + 记忆化dp)

    题目链接: http://codeforces.com/contest/835/problem/D 题意: 定义 k 度回文串为左半部分和右半部分为 k - 1 度的回文串 . 给出一个字符串 s, ...

  4. cf779D(记忆化dp)

    题目链接: http://codeforces.com/problemset/problem/799/D 题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中 ...

  5. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  6. POJ 1088 滑雪(简单的记忆化dp)

    题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<a ...

  7. POJ 1088 滑雪 记忆化DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K       Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...

  8. BNU 25593 Prime Time 记忆化dp

    题目链接:点击打开链接 题意: 一个游戏由3个人轮流玩 每局游戏由当中一名玩家选择一个数字作为開始 目的:获得最小的得分 对于当前玩家 O .面对 u 这个数字 则他的操作有: 1. 计分 u +1 ...

  9. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

随机推荐

  1. SpringBoot开发八-会话管理

    需求介绍-会话管理 利用Cookie和Seesion使得HTTP变成有会话的连接,写几个实例演示一下 代码实现 先写个例子,表示客户端第一次访问服务器,服务器端创建一个Cookie发送给客户端. 不管 ...

  2. docker搭建kafka集群(高级版)

    1. 环境docker, docker-compose 2.zookeeper集群 /data/zookeeper/zoo1/config/zoo.cfg # The number of millis ...

  3. 一个极其朴素的目录扫描Python脚本

    如果目录扫描工具被某些种类的waf拦截了,可以尝试(只是尝试,不是绝对能过)用脚本发出请求,具体功能看需求而定 原理...没啥原理,也没啥技术含量,相信大家都能看得懂的,nobody knows be ...

  4. 教你IO流来便利电脑磁盘所有文件,把图片放到一个文件夹里(会发现什么不可告人的密码)

    一.需求 我要把C盘下面的所有图片都拿出来,放到一个新文件夹中.今天小编一身正气,看看有没有什么意外发现!!学会看看自己的盘,悄悄的哦!!! 二.代码展示(运行时间可能有点长) import java ...

  5. ingress-nginx-controller 部署以及优化

    一.说明 本文使用的ingress-nginx v1.0 最新版本,v1.0 适用于 Kubernetes 版本 >= v1.19 小于这个版本的k8s集群,请降级ingress-nginx. ...

  6. io中的特殊流Properties

    对于去年学习IO的时候一些代码贴上来: 初识properties,因为继承自hashtable,其中可以使用put操作: package special; import java.util.Prope ...

  7. JavaWeb之文件上传、下载

    时间:2016-12-17 18:07 --文件上传概述上传不能使用BaseServlet1.文件上传的作用    例如网络硬盘,就是用来上传和下载文件的.2.文件上传对表单的限制    1)必须使用 ...

  8. 并发编程之:JMM

    并发编程之:JMM 大家好,我是小黑,一个在互联网苟且偷生的农民工. 上一期给大家分享了关于Java中线程相关的一些基础知识.在关于线程终止的例子中,第一个方法讲到要想终止一个线程,可以使用标志位的方 ...

  9. Web安全-信息收集

    信息收集 前言:在渗透测试过程中,信息收集是非常重要的一个环节,此环节的信息将影响到后续成功几率,掌握信息的多少将决定发现漏洞的机会的大小,换言之决定着是否能完成目标的测试任务.也就是说:渗透测试的思 ...

  10. Flink DataStream API 中的多面手——Process Function详解

    之前熟悉的流处理API中的转换算子是无法访问事件的时间戳信息和水位线信息的.例如:MapFunction 这样的map转换算子就无法访问时间戳或者当前事件的时间. 然而,在一些场景下,又需要访问这些信 ...