POJ1456贪心(set或者并查集区间合并)
题意:
给你n商品,每个商品有自己的价值还有保质期,一天最多只能卖出去一个商品,问最大收益是多少?
思路:
比较好想的贪心,思路是这样,每一次我们肯定拿价值最大的,至于在那天拿当然是尽可能的往后拖了,因为可以把前面的时间留给一些快过期的用,这种贪心策略很容易想到,对于实现的时候我尝试了两种方法,首先把商品按照价格从大到小排序,一个是我以前常用的set容器,他可以直接取出一个大于等于x的最小值(只要加上符号功能就是取最小的最大了),先把所有的天数都当成资源放进set里,然后对于没一个物品,如果可以买的话,那么就消耗离他保质期最近的那个没有备用的天,这样就行了,总的时间复杂度应该是O(n*log(n))的,可以接受,第二个方法我是用的并查集来处理区间合并,思路都是一样,就是在处理资源(天)的时候用并查集优化时间,比如一开始一个区间
1 2 3 4当第3天用了之后那么第三天就和第2天合并算一天了 1 2 4,就是这样每个天数的祖宗存的就是他左侧第一个没有用过的天数。这样写的话,如果用上路径压缩时间复杂度是O(n)的,比set快不少,如果不用路径压缩时间在逻辑上是O(n*n)的,但是刚刚我测试了下,跑了200+ac了。哎!这不重要。呵呵。
并查集+贪心 79ms
#include<stdio.h>
#include<algorithm>
#define N 10000 + 10
using namespace std;
typedef struct
{
int p ,d;
}NODE;
NODE node[N];
int mer[N];
bool camp(NODE a ,NODE b)
{
return a.p > b.p;
}
int finds(int x)
{
return x == mer[x] ? x : mer[x] = finds(mer[x]);
}
int main ()
{
int n ,ans ,i ,max;
while(~scanf("%d" ,&n))
{
max = 0;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d %d" ,&node[i].p ,&node[i].d);
if(max < node[i].d) max = node[i].d;
}
for(i = 0 ;i <= max ;i ++)
mer[i] = i;
ans = 0;
sort(node + 1 ,node + n + 1 ,camp);
for(i = 1 ;i <= n ;i ++)
{
int x = finds(node[i].d);
if(!x) continue;
int y = finds(x-1);
mer[x] = y;
ans += node[i].p;
}
printf("%d\n" ,ans);
}
return 0;
}
set+贪心 474ms
#include<set>
#include<stdio.h>
#include<algorithm>
#define N 10000 + 10
using namespace std;
typedef struct
{
int p ,d;
}NODE;
NODE node[N];
set<int>myset;
bool camp(NODE a ,NODE b)
{
return a.p > b.p;
}
int main ()
{
int n ,i;
while(~scanf("%d" ,&n))
{
int max = 0;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d %d" ,&node[i].p ,&node[i].d);
if(max < node[i].d) max = node[i].d;
}
myset.clear();
myset.insert(0);
for(i = 1 ;i <= max ;i ++)
myset.insert(-i);
sort(node + 1 ,node + n + 1 ,camp);
int ans = 0;
for(i = 1 ;i <= n ;i ++)
{
int x = *myset.lower_bound(-node[i].d);
if(!x) continue;
ans += node[i].p;
myset.erase(x);
}
printf("%d\n" ,ans);
}
return 0;
}
POJ1456贪心(set或者并查集区间合并)的更多相关文章
- POJ-1733 Parity game(带权并查集区间合并)
http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...
- HDU-3038 How Many Answers Are Wrong(带权并查集区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3038 大致题意: 有一个区间[0,n],然后会给出你m个区间和,每次给出a,b,v,表示区间[a,b]的区间和为 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- [BZOJ 4668]冷战(带边权并查集+启发式合并)
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...
- Codeforces 1166F 并查集 启发式合并
题意:给你一张无向图,无向图中每条边有颜色.有两种操作,一种是询问从x到y是否有双彩虹路,一种是在x到y之间添加一条颜色为z的边.双彩虹路是指:如果给这条路径的点编号,那么第i个点和第i - 1个点相 ...
- POJ-1456 Supermarket 销售商品【贪心】+【并查集】
题目链接:http://poj.org/problem?id=1456 题目大意: 有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天 ...
随机推荐
- MySql学习---数据库基本类型,事务,多表查询
数据库分类 关系型数据库 行列, 列如Mysql,oracle 通过表和表之间,行和列之间的关系进行数据的存储 非关系型数据库: Redis,MongDb 以对象存储,同过对象的自身属性来决定 表与表 ...
- 前端学习 node 快速入门 系列 —— 简易版 Apache
其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...
- Java8的新特性--并行流与串行流
目录 写在前面 Fork/Join框架 Fork/Join框架与传统线程池的区别 传统的线程池 Fork/Join框架 Fork/Join框架的使用 Java8中的并行流 写在前面 我们都知道,在开发 ...
- Springboot项目启动后自动创建多表关联的数据库与表的方案
文/朱季谦 在一些项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据 ...
- DataTable.SELECT日期类型筛选处理
初始化: public DataTable1() { InitializeComponent(); Init(); } private void Init() { dt = new DataTable ...
- Bug调试专项训练四笔记
Ajax案例一 导入项目直接运行出现联想无反应 错误原因: 错误1: 55行找不到方法: 错误1解决方案: 解决错误1点击仍无反应 错误2:通过浏览器得出错误2:58行找不到方法 错误2解决方案: 解 ...
- MUV LUV UNLIMITED Gym - 102361K
题目链接:https://vjudge.net/problem/Gym-102361K 题意:两个人轮流取树叶,最后没有树叶取的人输. 思路:求出所有树叶所在链的长度即可,如果都为偶数先手必败,否则先 ...
- 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计
一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...
- 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...
- 【Visual Studio调教小记录】C++指针靠前靠后??
本文地址:https://www.cnblogs.com/oberon-zjt0806/p/14631149.html 甜咸之争 经常写C++的基本上避不开使用指针,而且C++中指针类型的写法大体上有 ...