分几种情况讨论:

(1)仅用C或D买两个

  ①买两个代价相同的(实际不同)(排个序)

  ②买两个代价不同的(因为买两个代价相同的情况已经考虑过了,所以此时对于同一个代价,只需要保存美丽度最高的喷泉即可)(预处理b[i],表示代价小于等于i的物品中,美丽度最大的是多少。为了防止重复购买,枚举其中一个,然后另一个只买代价小于其代价的物品。)

(2)用C和D各买一个

按这几种情况分类,可以比较好地避免买到同一个喷泉的情况。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. int n,c,d,b[100010],p[100010];
  5. char op[100010][3];
  6. struct data{
  7. int v,c;
  8. }a1[100010],a2[100010];
  9. int b1[100010],b2[100010];
  10. bool operator < (const data &a,const data &b){
  11. return a.c!=b.c ? a.c<b.c : a.v<b.v;
  12. }
  13. int ans=0;
  14. int main(){
  15. // freopen("c.in","r",stdin);
  16. scanf("%d%d%d",&n,&c,&d);
  17. int m1=0,m2=0;
  18. for(int i=1;i<=n;++i){
  19. scanf("%d%d%s",&b[i],&p[i],op[i]);
  20. if(op[i][0]=='C'){
  21. a1[++m1]=(data){b[i],p[i]};
  22. }
  23. else{
  24. a2[++m2]=(data){b[i],p[i]};
  25. }
  26. }
  27. sort(a1+1,a1+m1+1);
  28. for(int i=2;i<=m1;++i){
  29. if(a1[i].c==a1[i-1].c && a1[i].c*2<=c){
  30. ans=max(ans,a1[i].v+a1[i-1].v);
  31. }
  32. }
  33. for(int i=1;i<=m1;++i){
  34. b1[a1[i].c]=max(b1[a1[i].c],a1[i].v);
  35. }
  36. for(int i=1;i<=c;++i){
  37. b1[i]=max(b1[i],b1[i-1]);
  38. }
  39. for(int i=1;i<=m1;++i){
  40. if(a1[i].c<=c && b1[min(c-a1[i].c,a1[i].c)-(a1[i].c<=c-a1[i].c)]){
  41. ans=max(ans,a1[i].v+b1[min(c-a1[i].c,a1[i].c)-(a1[i].c<=c-a1[i].c)]);
  42. }
  43. }
  44.  
  45. sort(a2+1,a2+m2+1);
  46. for(int i=2;i<=m2;++i){
  47. if(a2[i].c==a2[i-1].c && a2[i].c*2<=d){
  48. ans=max(ans,a2[i].v+a2[i-1].v);
  49. }
  50. }
  51. for(int i=1;i<=m2;++i){
  52. b2[a2[i].c]=max(b2[a2[i].c],a2[i].v);
  53. }
  54. for(int i=1;i<=d;++i){
  55. b2[i]=max(b2[i],b2[i-1]);
  56. }
  57. for(int i=1;i<=m2;++i){
  58. if(a2[i].c<=d && b2[min(d-a2[i].c,a2[i].c)-(a2[i].c<=d-a2[i].c)]){
  59. ans=max(ans,a2[i].v+b2[min(d-a2[i].c,a2[i].c)-(a2[i].c<=d-a2[i].c)]);
  60. }
  61. }
  62.  
  63. if(b1[c] && b2[d]){
  64. ans=max(ans,b1[c]+b2[d]);
  65. }
  66.  
  67. printf("%d\n",ans);
  68. return 0;
  69. }

【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains的更多相关文章

  1. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)

    A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  2. 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 ...

  3. 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 ...

  4. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) 一夜回到小学生

    我从来没想过自己可以被支配的这么惨,大神讲这个场不容易掉分的啊 A. Carrot Cakes time limit per test 1 second memory limit per test 2 ...

  5. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) E - Aquarium decoration 贪心 + 平衡树

    E - Aquarium decoration 枚举两个人都喜欢的个数,就能得到单个喜欢的个数,然后用平衡树维护前k大的和. #include<bits/stdc++.h> #define ...

  6. 【动态规划】【滚动数组】【搜索】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) D. Field expansion

    显然将扩张按从大到小排序之后,只有不超过前34个有效. d[i][j]表示使用前i个扩张,当length为j时,所能得到的最大的width是多少. 然后用二重循环更新即可, d[i][j*A[i]]= ...

  7. 树状数组 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 ...

  8. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) D. Field expansion

    D. Field expansion time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. 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  ...

随机推荐

  1. bzoj 1014 splay

    首先我们可以用splay来维护这个字符串,那么对于某两个位置的lcp,维护每个节点的子树的hash,然后二分判断就好了. /************************************** ...

  2. highcharts 从后台动态改变数据

    //columnChart    图表对象,创建示例就展示了. var series = this.columnChart.series;                            whi ...

  3. spring boot 注解说明

    Starters 可以创建自己的Starter,但名字格式不能是 spring-boot-starter-*,而是 *-spring-boot-starter.类似Maven插件的规则.   自动配置 ...

  4. 关于tcp连接对象在多进程中的错误:pickle.PicklingError

    如果需要在多进程中使用tcp连接的对象,那么不能再主进程中将这个对象创建好当做参数传给子进程,因为在创建子进程是需要序列化对象,然而socket对象是不能序列化的,会产生一个pickle.Pickli ...

  5. Swift 特殊关键字 与符号

    #available() 函数来检查API函数的可用性 // 判断当前版本是否 iOS8.0+,OSX10.10+以及以其他平台 if #available(iOS 8.0, OSX 10.10, * ...

  6. ServerSocket和Socket通信

    服务器端: 1.服务器端建立通信ServerSocket对象,并设置端口号 2.服务器建立Socket接收客户端连接 3.建立IO输入流读取客户端发送的数据 4.建立IO输出流向客户端输出数据 客户端 ...

  7. vue做购物车

    写一点废话,昨天敲代码找bug,找了好久都没找到,后来一哥们找到他说,找代码的bug就像男女朋友吵架,女问男你错了没,男说错啦,女再问错哪了,男傻眼了不知道错哪.在找代码的过程中一直知道我错啦就是找不 ...

  8. C#判断目录是否为隐藏

    判断方法: DirectoryInfo di = new DirectoryInfo(path); if ((di.Attributes & FileAttributes.Hidden) == ...

  9. JWT认证不通过导致不能访问视图的解决方案

    在做商城项目的购物车模块时,发现了一个问题. 需求:当用户登录时,添加商品到购物车的数据保存在redis.当用户未登录时,添加商品到购物车的数据保存在cookies.两个功能都写在一个视图里面.以JW ...

  10. Linux下几种并发服务器的实现模式

    Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. ...