POJ3614奶牛晒阳光DINIC或者贪心
题意:
n个区间,m种点,每种点有ci个,如果一个点的范围在一个区间上,那么就可以消耗掉一个区间,问最多可以消耗多少个区间,就是这n个区间中,有多少个可能被抵消掉。
思路:
方法不唯一,首先可以用贪心来做,看到网上说的都是优先队列的解法,我说下我的想法,我是直接sort排序后暴力(其实根本达不到n*m*l的时间复杂度),我先把所有老牛也就是区间按照上端点(***不是他们说的下端点)从小打到排序,然后在把护肤品按照第一个值从小到大排序,然后就是给给每一个护肤品尽可能找到一个点,同时这个点的右端点尽可能的小,为了后面别的护肤品留下更大的机会,下面分析枚举代码
第i个护肤品的第j个和第k只奶牛
for(i = 1 ;i <= m ;i ++)
for(j = 1 ;j <= sp[i].c ;j ++)
{
for(k = 1 ;k <= n ;k ++)
if(!mark[k] && cow[k].l <= sp[i].p && cow[k].r >= sp[i].p)
{
ans ++;
mark[k] = 1;
break;
}
if(k == n + 1) 我个人觉得我加的这个地方可以很好的优化掉很多数据,这么加的
break; 依据是如果第i种护肤品的第j个不能给剩下的奶牛用了,那么第i种
} 的其他的也没用了,直接break
还有就是这个题目可以最大流来做,至于用那种算法,自己随意吧,我用的是DINC,建图比较简单,我不想说了,如果你做过流的话一下就能想到建图了,其实我感觉这个题目用最大流有点悬,但是AC了,因为边的条数可能达到 (2500*2500+5000)* 2 = 12510000。
贪心
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 2500 + 10
using namespace std;
typedef struct
{
int l ,r;
}COW;
typedef struct
{
int p ,c;
}SP;
COW cow[N];
SP sp[N];
int mark[N];
bool camp1(COW a ,COW b)
{
return a.r < b.r;
}
bool camp2(SP a ,SP b)
{
return a.p < b.p;
}
int main ()
{
int n ,m, i ,j ,k;
while(~scanf("%d %d" ,&n ,&m))
{
for(i = 1 ;i <= n ;i ++)
scanf("%d %d" ,&cow[i].l ,&cow[i].r);
for(i = 1 ;i <= m ;i ++)
scanf("%d %d" ,&sp[i].p ,&sp[i].c);
sort(cow + 1 ,cow + n + 1 ,camp1);
sort(sp + 1 ,sp + m + 1 ,camp2);
memset(mark ,0 ,sizeof(mark));
int ans = 0;
for(i = 1 ;i <= m ;i ++)
for(j = 1 ;j <= sp[i].c ;j ++)
{
for(k = 1 ;k <= n ;k ++)
if(!mark[k] && cow[k].l <= sp[i].p && cow[k].r >= sp[i].p)
{
ans ++;
mark[k] = 1;
break;
}
if(k == n + 1)
break;
}
printf("%d\n" ,ans);
}
return 0;
}
DINIC
#include<queue>
#include<stdio.h>
#include<string.h>
#define N_node 2500 + 10
#define N_edge (2500 * 2500 + 5000) * 2 + 100
#define INF 1000000000
using namespace std;
typedef struct
{
int to ,cost ,next;
}STAR;
typedef struct
{
int x ,t;
}DEP;
typedef struct
{
int l ,r;
}COW;
typedef struct
{
int p ,c;
}SP;
COW cow[N_node];
SP sp[N_node];
STAR E[N_edge];
int list[N_node] ,list2[N_node] ,tot;
int deep[N_node];
DEP xin ,tou;
int minn(int x ,int y)
{
return x < y ? x : y;
}
void add(int a ,int b ,int c)
{
E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
E[++tot].to = a;
E[tot].cost = 0;
E[tot].next = list[b];
list[b] = tot;
}
bool BFS_Deep(int s ,int t ,int n)
{
memset(deep ,255 ,sizeof(deep));
xin.x = s ,xin.t = 0;
deep[xin.x] = xin.t;
queue<DEP>q;
q.push(xin);
while(!q.empty())
{
tou = q.front();
q.pop();
for(int k = list[tou.x] ;k ;k = E[k].next)
{
int to = E[k].to;
if(deep[to] != -1 || !E[k].cost)
continue;
xin.x = to ,xin.t = tou.t + 1;
deep[xin.x] = xin.t;
q.push(xin);
}
}
for(int i = 0 ;i <= n ;i ++)
list2[i] = list[i];
return deep[t] != -1;
}
int DFS_Flow(int s ,int t ,int flow)
{
if(s == t) return flow;
int nowflow = 0;
for(int k = list2[s] ;k ;k = E[k].next)
{
int to = E[k].to;
int c = E[k].cost;
list2[s] = k;
if(deep[to] != deep[s] + 1 || !c)
continue;
int tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));
nowflow += tmp;
E[k].cost -= tmp;
E[k^1].cost += tmp;
if(flow == nowflow) break;
}
if(!nowflow) deep[s] = 0;
return nowflow;
}
int DINIC(int s ,int t ,int n)
{
int ans = 0;
while(BFS_Deep(s ,t ,n))
{
ans += DFS_Flow(s ,t ,INF);
}
return ans;
}
int main ()
{
int n ,m, i ,j;
while(~scanf("%d %d" ,&n ,&m))
{
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d %d" ,&cow[i].l ,&cow[i].r);
add(0 ,i ,1);
}
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d" ,&sp[i].p ,&sp[i].c);
add(i + n ,m + n + 1 ,sp[i].c);
}
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= m ;j ++)
if(cow[i].l <= sp[j].p && cow[i].r >= sp[j].p)
add(i ,j + n ,1);
printf("%d\n" ,DINIC(0 ,n + m + 1 ,n + m + 1));
}
return 0;
}
POJ3614奶牛晒阳光DINIC或者贪心的更多相关文章
- [NOIP模拟赛][贪心]奶牛晒衣服.
奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任.洗 ...
- NOIP模拟赛-奶牛晒衣服(dry)
一.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任 ...
- NOIP2012模拟试题【奶牛晒衣服】
1.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任 ...
- A. 【例题1】奶牛晒衣服
A . [ 例 题 1 ] 奶 牛 晒 衣 服 A. [例题1]奶牛晒衣服 A.[例题1]奶牛晒衣服 关于很水的题解 既然是最少时间,那么就是由最湿的衣服来决定的.那么考虑烘干机对最湿的衣服进行操作 ...
- 洛谷 P1843 奶牛晒衣服
题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...
- [Luogu1843]奶牛晒衣服
题目大意: 你要晒n件衣服,第i件衣服有w[i]滴水, 每件衣服每秒钟会自然风干a滴水,将这件衣服放入烘干机中每秒钟会烘干a+b滴水. 一秒钟不可以拆开,问晒干所有的衣服至少要多少时间? 思路: 二分 ...
- 洛谷——P1843 奶牛晒衣服
https://www.luogu.org/problem/show?pid=1843#sub 题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣 服就成了很不爽的事情. ...
- P1843 奶牛晒衣服
链接:Miku -------------------------------- 这是一道二分答案的题,我们要二分时间. 对于每件衣服,我们自然是能让它自己蒸发就自己蒸发,这样才是最优的. 那么我闷可 ...
- P1843 奶牛晒衣服(二分)
思路:就是一个模板,只是找最小化而已.在判断函数里面:当湿度<=x*A不判断, 反之sum+=(a[i]-x*A)/B+(a[i]-x*A)%B?1:0; #include<iostrea ...
随机推荐
- Python 元类编程实现一个简单的 ORM
概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...
- 关于搬运CSDN上学生信息管理系统的阅读与二次开发
关于本篇博客内容,我大概分成了三个部分进行讲述:对于源代码的解读.二次重开发后程序的介绍和自己在做完对他人代码的解读和重开发后自己的一些感想. 一. 源代码的解读 在本部分的解读中主要分为三部分:该 ...
- Redis工具收费后新的开源已出现
作者:三十三重天 博客: zhouhuibo.club 引言 Redis工具哪家强,中国山东找蓝翔.哎呀,串台了. 众所周知,开源的最终还是收费. Reids Desktop 秉承了这一理念,苦逼的程 ...
- 订单退款&重复支付需求疑问点归纳整理
更新历史记录: 更新内容 更新人 更新时间 新建 Young 2020.12.10 16:45 更新产品疑问解答 Young 2020.12.11 10:14 更新退款权益终止时间 Young 2 ...
- Pyqt5学习笔记(一)
Python已有的GUI框架: Tkinter(python内嵌的GUI环境,使用TCL实现,易学易用,方便简单创GUI自带无需安装,适用于Unix.Windows和Mac系统组,在Tk8.0的后续版 ...
- HDFS的上传流程以及windows-idea操作文件上传的注意
HDFS的上传流程 命令:hdfs dfs -put xxx.wmv /hdfs的文件夹 cd进入到要上传文件的当前目录,再输入hdfs命令上传,注意-put后tab可以自动补全, 最后加上你要上传到 ...
- [源码分析] 消息队列 Kombu 之 Hub
[源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...
- python-实现双链表
双链表和单链表进行比较的优点与不同 节点多了一个前驱指针域 在很多基本操作上,多了一种选择,因为双链表可以向前进行移动寻位 如果给每个节点添加一个对应的下标,那么在寻找节点时,我们可以使用二分发来进行 ...
- C语言中复杂声明的解读和简化
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- Python基础之告警定义与告警抑制
技术背景 在前面一篇博客中我们介绍了在python中自定义异常以及异常的捕获.这里我们要介绍另外一种形式的用户提醒:告警.我们这里就不给出一些过于官方或者技术的定义了,在实际项目中的使用场景主要有这么 ...