贪心 CF 332 C 好题 赞
题目链接:
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从小到大排序。
写的有点啰嗦,但应该说清楚了。
主要思想:
当有两个优先级不同的限制条件时,先以第二优先级的最坏的打算来保证第一优先级,再在第一优先级得到满足条件下,来使得第二优先条件(本题是愤怒值最大)得到满足。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
#define N 101000 int n,k,p; struct Inf
{
int ai,bi,ii,bbii;
}inf1[N],inf2[N]; bool cmp2(struct Inf a,struct Inf b)
{
if(a.ai!=b.ai)
return a.ai>b.ai;
return a.bi>b.bi; //尽量把愤怒值小的往后放
} bool cmp1(struct Inf a,struct Inf b)
{
if(a.bi!=b.bi)
return a.bi>b.bi;
return a.ai<b.ai; //从主席这一方面考虑,在相同的愤怒值中,他会选a小的那个命令
}
//本题是难得的贪心好题,
//当有多个优先级不同的限制条件时,先以最坏的打算来保证第一优先级条件,再在第一优先条件下,来使得第二优先条件(本题是愤怒值最大)得到满足
int main()
{
while(scanf("%d%d%d",&n,&p,&k)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&inf1[i].ai,&inf1[i].bi);
inf1[i].ii=i;
}
sort(inf1+1,inf1+n+1,cmp1);
memcpy(inf2,inf1,sizeof(inf1));
for(int i=1;i<=n;i++)
inf1[i].bbii=i;
sort(inf1+1,inf1+n-(p-k)+1,cmp2);//保证后面至少有p-k个,使得先最大化suma int j=0;
for(int i=1;i<=k;i++)
{
printf("%d ",inf1[i].ii); //先保证最大化a
j=max(j,inf1[i].bbii); //把最小的b找到
} //在最大化suma的同时,要考虑当相等的suma时,要使sumb尽可能大
sort(inf2+j+1,inf2+n+1,cmp1);//重新选择sumb
for(int i=j+1;i<=j+(p-k);i++)
printf("%d ",inf2[i].ii);
putchar('\n'); }
return 0;
}
贪心 CF 332 C 好题 赞的更多相关文章
- HDU 2037 今年暑假不AC(贪心,区间更新,板子题)
今年暑假不AC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 贪心--cf、education62-C
cf-Education 62-C 题目 C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes i ...
- 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 ...
- CF #324 DIV2 E题
这题很简单,把目标位置排序,把目标位置在当前位置前面的往前交换,每次都是贪心选择第一个满足这样要求的数字. #include <iostream> #include <cstdio& ...
- 【LeetCode】贪心 greedy(共38题)
[44]Wildcard Matching [45]Jump Game II (2018年11月28日,算法群衍生题) 题目背景和 55 一样的,问我能到达最后一个index的话,最少走几步. 题解: ...
- cf Canada cup A题
A. Jumping Ball time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 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 ...
- POJ 2054 Color a Tree#贪心(难,好题)
题目链接 代码借鉴此博:http://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html 其中关于max{c[fa]/t[fa]}贪心原则, ...
- Educational Codeforces Round 24 CF 818 A-G 补题
6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...
随机推荐
- Selenium2+Python自动化测试实战
本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用.后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的 ...
- UCOS 堆栈大小 计算 (堆栈的决定性因素)
决定栈空间的大小,不仅需要计算任务本身的需求(局部变量.函数调用等),还要计算最多中断嵌套层数(保存寄存器.中断服务程序中局部变量等) 原文地址:uCOS任务堆栈的深入分析.作者:jiecou 堆栈作 ...
- 【学习笔记】【Foundation】字典
字典NSDictionary: 用于保存具有映射关系的数据:key-value: 创建NSDictionary的常用方法: dictionary: dictionaryWithContentsOfFi ...
- 1160 蛇形矩阵(codevs)
http://codevs.cn/problem/1160/ 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1 ...
- 读、写SD上的文件请按如下步骤进行
1.调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且应用程序具有读写SD卡的权限.例如使用如下代码//Environment.getE ...
- linux应用程序地址布局
Linux应用程序在内存中的布局,由高地址到低地址依次为:栈.堆.BSS段.数据段.代码段.代码段的起始地址固定为0x8048000,无论哪一个应用程序它的代码段起始地址一定是0x8048000,这里 ...
- 精美实用的jQuery插件精选
jQuery的确是一款相当强大的Javascript框架,同时jQuery的插件就多入牛毛,如果你善于收集,那么你在写前端页面的时候肯定会更加方便.本文精选了一些精美实用的jQuery插件供大家参考. ...
- AES - Rijndael 算法(三)
四.Rijndael算法实现,java版本 public class Rijndael_Algorithms { private byte[] key; /**------------------ ...
- Java Hibernate 之连接池详解
Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP.在配置连接池时需要注意的有三点: 一.Apche的DBCP在Hibernate2中受支持,但在Hiber ...
- iOS- UITableView could not hold the selected row after reload
I like stackoverflow.. Answer : http://stackoverflow.com/questions/6649202/uitableview-doesnt-keep-r ...