hihoCoder#1838 : 鎕鎕鎕 贪心
2024-09-03 11:49:10
题解:
神奇的贪心题,,,感觉每次做贪心题都无从下手。。。
我们首先按照a对所有卡片从小到大排序,然后从1开始,从连续的两张牌中取b最大的,最后一张单出来的也取了。
可以证明,这样的方案一定是合法的。
为什么呢?
假设我们将排序后的牌按照(1, 2) (3, 4) ……这样的方式两两分组,那么既然我们每次都是取b最大的那张,b的限制显然我们已经满足了。
现在来考虑a,假设我们遇到了最坏的情况,在每一组里面,我们都取到了a最小的那个,即我们取到了第1, 3, 5,……张牌(因为已经排好序了,所以a最小的一定是这些),那么这个时候我们可以改变一下分组方式由原来的(1, 2) (3, 4) ……变成1, (2, 3), (4, 5) ……(2 * n, 2 * n + 1),那么你可以发现,这时我们取的牌就变成了任意组当中a最大的那张,因此a也是满足条件的。
证明完毕。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 210000 int n; struct card{
int a, b, id;
}s[AC]; inline bool cmp(card x, card y)
{
return x.a < y.a;
} inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} void pre()
{
n = read();
int b = * n + ;
for(R i = ; i <= b; i ++)
s[i].a = read(), s[i].b = read(), s[i].id = i;
sort(s + , s + b + , cmp);
} void work()
{
int b = * n;
for(R i = ; i <= b; i += )
{
if(s[i].b > s[i + ].b) printf("%d\n", s[i].id);
else printf("%d\n", s[i + ].id);
}
printf("%d\n", s[ * n + ].id);
} int main()
{
freopen("in.in", "r", stdin);
pre();
work();
fclose(stdin);
return ;
}
最新文章
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
- 如何创建一个GitLab Web Hooks?
- Modbus总线CRC16效验算法C语言
- Android Service完全解析,关于服务你所需知道的一切(上)
- Android数据存储之SQLite的操作
- Marching Cube
- java多线程编程(二创建线程)
- javascript设计模式学习之六——代理模式
- 如何查看lib文件的导出函数
- Oracle自定义数据类型 1
- mysql的基础操作
- js存款计算器原生小demo
- CentOS7 Redis安装
- yii批量插入的方法
- 使用原生 JS 复制文本兼容移动端 iOS &; android
- npm WARN enoent ENOENT: no such file or directory, open &#39;C:\Users\package.json&#39;
- windows下bat批处理执行sql语句__Mysql
- Coprime (单色三角形+莫比乌斯反演(数论容斥))
- 第19月第2天 cellForItemAtIndexPath 返回空
- pyquery的使用
热门文章
- 前端图片转base64,转格式,转blob,上传的总结
- WeTest功能优化第2期:云真机智能投屏,调试告别鼠标
- ElasticSearch搜索引擎安装配置中文分词器IK插件
- Selenium WebDriver(Python)API
- Linux命令应用大词典-第28章 硬件管理
- leetcode-买卖股票的最佳时机(动态规划)
- BFC与合并 浅析
- java.net.ProtocolException: Server redirected too many times
- codeforces 295C Greg and Friends(BFS+DP)
- redis集群sentinel哨兵模式的搭建与实际应用