题目链接:

http://codeforces.com/problemset/problem/332/C

题目意思:

有n个命令,要通过p个,某主席要在通过的p个中选择k个接受。

每个任务有两个值ai,bi, ai表示如果该主席接受该命令,她的头发变灰的数量,bi表示如果该主席不接受该命令时,议员不高兴值。

对于通过的p个命令,该主席要使议员的不高兴值和最小,在相同的情况下,要使自己的头发变灰的数量尽可能的少。

让你求出通过哪p个命令,使得该主席的头发变灰的数量最多,在相同的情况下,输出使议员不高兴最大的选择。

解题思路:

很好的一道贪心题目。

首先须知道,对于每一个选择(p命令),该主席一定是把b值最小的p-k个留下,如果有相同的,则尽可能使自己的头发变灰的数量最小。

为了先使该主席的suma最大,先按b从大到小排序,有相同的则按a从小到大排序。把后面p-k个留下,这样就一定可以确保suma尽可能大,因为对于后面的b较小的p-k个,无论a有多大,如果选它都没用,a不能发挥作用,所以只能从前n-(p-k)个里选。所以再把前n-(p-k)个按a从大到小排序,如果a相等则按b从大到小(把小的b尽可能靠后,为了在相同的a的情况下,sumb尽可能的大)。选出前k个输出(这就是最大的suma),然后在最大的suma的情况下,把最小的b的下标找到,然后对后面的所有小b的情况,按b从大到小排序,选出最大的p-k个。

标注红颜色的那句话,很关键。如果b有相等的情况,如果按a从大到小排序,虽然这时候算出的suma可能更大,可是,当这样的p个命令确定后,当b相同的情况下,该主席肯定会选a大的。所以这时算的suma就不准确,所以应该按a从小到大排序。

写的有点啰嗦,但应该说清楚了。

主要思想:

当有两个优先级不同的限制条件时,先以第二优先级的最坏的打算来保证第一优先级,再在第一优先级得到满足条件下,来使得第二优先条件(本题是愤怒值最大)得到满足。

代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<string>
  6. #include<cstring>
  7. #include<algorithm>
  8. #include<vector>
  9. #include<map>
  10. #include<set>
  11. #include<stack>
  12. #include<list>
  13. #include<queue>
  14. #define eps 1e-6
  15. #define INF 0x1f1f1f1f
  16. #define PI acos(-1.0)
  17. #define ll __int64
  18. #define lson l,m,(rt<<1)
  19. #define rson m+1,r,(rt<<1)|1
  20. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  21. using namespace std;
  22.  
  23. /*
  24. freopen("data.in","r",stdin);
  25. freopen("data.out","w",stdout);
  26. */
  27. #define N 101000
  28.  
  29. int n,k,p;
  30.  
  31. struct Inf
  32. {
  33. int ai,bi,ii,bbii;
  34. }inf1[N],inf2[N];
  35.  
  36. bool cmp2(struct Inf a,struct Inf b)
  37. {
  38. if(a.ai!=b.ai)
  39. return a.ai>b.ai;
  40. return a.bi>b.bi; //尽量把愤怒值小的往后放
  41. }
  42.  
  43. bool cmp1(struct Inf a,struct Inf b)
  44. {
  45. if(a.bi!=b.bi)
  46. return a.bi>b.bi;
  47. return a.ai<b.ai; //从主席这一方面考虑,在相同的愤怒值中,他会选a小的那个命令
  48. }
  49. //本题是难得的贪心好题,
  50. //当有多个优先级不同的限制条件时,先以最坏的打算来保证第一优先级条件,再在第一优先条件下,来使得第二优先条件(本题是愤怒值最大)得到满足
  51. int main()
  52. {
  53. while(scanf("%d%d%d",&n,&p,&k)!=EOF)
  54. {
  55. for(int i=1;i<=n;i++)
  56. {
  57. scanf("%d%d",&inf1[i].ai,&inf1[i].bi);
  58. inf1[i].ii=i;
  59. }
  60. sort(inf1+1,inf1+n+1,cmp1);
  61. memcpy(inf2,inf1,sizeof(inf1));
  62. for(int i=1;i<=n;i++)
  63. inf1[i].bbii=i;
  64. sort(inf1+1,inf1+n-(p-k)+1,cmp2);//保证后面至少有p-k个,使得先最大化suma
  65.  
  66. int j=0;
  67. for(int i=1;i<=k;i++)
  68. {
  69. printf("%d ",inf1[i].ii); //先保证最大化a
  70. j=max(j,inf1[i].bbii); //把最小的b找到
  71. } //在最大化suma的同时,要考虑当相等的suma时,要使sumb尽可能大
  72. sort(inf2+j+1,inf2+n+1,cmp1);//重新选择sumb
  73. for(int i=j+1;i<=j+(p-k);i++)
  74. printf("%d ",inf2[i].ii);
  75. putchar('\n');
  76.  
  77. }
  78. return 0;
  79. }

贪心 CF 332 C 好题 赞的更多相关文章

  1. HDU 2037 今年暑假不AC(贪心,区间更新,板子题)

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  2. 贪心--cf、education62-C

    cf-Education 62-C 题目 C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes i ...

  3. Codeforces Round #354 (Div. 2)-C. Vasya and String,区间dp问题,好几次cf都有这种题,看来的好好学学;

    C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. CF #324 DIV2 E题

    这题很简单,把目标位置排序,把目标位置在当前位置前面的往前交换,每次都是贪心选择第一个满足这样要求的数字. #include <iostream> #include <cstdio& ...

  5. 【LeetCode】贪心 greedy(共38题)

    [44]Wildcard Matching [45]Jump Game II (2018年11月28日,算法群衍生题) 题目背景和 55 一样的,问我能到达最后一个index的话,最少走几步. 题解: ...

  6. cf Canada cup A题

    A. Jumping Ball time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  7. CF 439D(251D题)Devu and his Brother

    Devu and his Brother time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. POJ 2054 Color a Tree#贪心(难,好题)

    题目链接 代码借鉴此博:http://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html 其中关于max{c[fa]/t[fa]}贪心原则, ...

  9. Educational Codeforces Round 24 CF 818 A-G 补题

    6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...

随机推荐

  1. php urlencode()函数URL编码转换实例解析

    URLEncode:是对网页url所包含中文字符的一种编码转化方式,URLEncode有两种常见方式,一种是基于GB2312的 Encode(Baidu.Yisou等搜索引擎使用),另一种是基于UTF ...

  2. 【创建型】Singleton模式

    单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...

  3. Pycharm在创建py文件时,如何自动添加文件头注释(类似于钩子特性)?

    在每次新建一个py文件的时候 1 如何自动添加/usr/bin/env python2 自动添加 coding=utf8 操作方法: File->settings->Editor-> ...

  4. DOS头 IMAGE_DOS_HEADER

    IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 +2h WORD e_ ...

  5. 重构遗留程序的一次案例学习(java程序)

    遗留代码经常是腐臭的,每个优秀的开发者都想把它重构.而进行重构的一个理想的先决条件是,它应该包含一组单元测试用例,以避免产生回归缺陷.但是为遗留代码编写单元测试可不是件容易的事,因为它经常是一团糟.要 ...

  6. Hibernate+JPA

    参考链接:http://blog.163.com/hero_213/blog/static/398912142010312024809 近年来ORM(Object-Relational Mapping ...

  7. LeetCode_Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. C++实现发送HTTP请求

    #include <stdio.h>#include <windows.h>#include <wininet.h> #define MAXSIZE 1024#pr ...

  9. 包含无数好东西的ownCloud

    ownCloud 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于Ph ...

  10. Mac OS X Shell 脚本和终端命令

    系统 重启 Mac OS X: 1 shutdown - r now 关闭 Mac OS X: 1 shutdown now 电源管理/省电 获取当前电源管理设置的信息 1 pmset -g 设置显示 ...