座位安排(seat)
座位安排(seat)
题目描述
费了一番口舌,wfj_2048终于成功地说服了n∗mn∗m个妹子来陪自己看电影。
为了这次声势浩大,wfj_2048包下了一座有n∗mn∗m个座位的电影院。 (wfj_2048坐哪?我也不知道。。。。。。) 电影院前门的坐标为(0,0)(0,0),后门的坐标为(0,m+1)(0,m+1)。有kk个妹子站在前门外,剩下的n∗m−kn∗m−k个站在后门外。
但是,问题来了:每个妹子都有一个不一定相同的忍耐值ss,若从她到达的门到座位的曼哈顿距离超过ss,她会感到不爽并离开,可wfj_2048不想错过任何一个妹子。于是,他想让你告诉他:是否存在一种方案,使得所有的妹子都能安排到合适的座位,且没有妹子会离开?
输入
第一行为nn和mm,意义如描述之所示
第二行一个整数kk,接着kk个整描述前门外的kk个妹子的ss值
第三行一个整数n∗m−kn∗m−k,接着n∗m−kn∗m−k个数描述后门外的妹子的ss值
输出
若存在合法的座位安排方案则输出YESYES,否则输出NONO。
样例输入
样例输入1
2 2
3 3 3 2
1 3
样例输入2
2 2
3 2 3 3
1 2
样例输出
样例输出1
YES
样例输出2
NO
提示
【数据范围】
子任务1:3030:n∗m≤10n∗m≤10
子任务2:3030:n∗m≤1000n∗m≤1000
子任务3:4040:n∗m≤100000n∗m≤100000
来源
solution
按忍耐度从小到大考虑前门的每一个妹子。
对于一个妹子,她能坐的范围应该是一个类似三角形的区域(x+y<=k).
把这些位置取出来,按位置到后门的距离放进堆里。每次取堆顶即可。
为什么这是对的呢?
首先我从小到大考虑忍耐度,不会出现忍耐度大的妹子占了位置而忍耐度小的妹子没位置坐。
也就是在尽量保证合法的情况下优化后门的方案。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 100005
using namespace std;
int nn,n,m,k1,k2,a[maxn],b[maxn];
struct node{
int v;
bool operator <(node T)const{
return T.v>v;
}
}t;
priority_queue<node>q;
int main()
{
freopen("seat.in","r",stdin);
freopen("seat.out","w",stdout);
scanf("%d%d%d",&n,&m,&k1);
int nn=n*m;
for(int i=1;i<=k1;i++)scanf("%d",&a[i]);
scanf("%d",&k2);
for(int i=1;i<=k2;i++)scanf("%d",&b[i]);
sort(a+1,a+k1+1);sort(b+1,b+k2+1);
int now=0;
for(int i=1;i<=k2;i++){
if(b[i]>now){
for(int j=now+1;j<=b[i];j++){
int o=min(j,n+1);
for(int x=max(1,j-m);x<o;x++){
int y=m+1-(j-x);
t.v=x+y;q.push(t);
}
}
now=b[i];
}
if(q.empty()){
puts("NO");return 0;
}
q.pop();
}
for(int j=now+1;j<=n+m;j++){
int o=min(j,n+1);
for(int x=max(1,j-m);x<o;x++){
int y=m+1-(j-x);
t.v=x+y;q.push(t);
}
}
for(int i=k1;i>=1;i--){
t=q.top();q.pop();
if(t.v>a[i]){puts("NO");return 0;}
}
puts("YES");
return 0;
}
座位安排(seat)的更多相关文章
- 洛谷——P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- 洛谷 P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- 【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas
∵每个座位可以坐俩人,所以拆点最大匹配. #include<cstdio> #include<vector> #include<cstring> using nam ...
- 洛谷P1386座位安排
座位安排 今天,在机房里做了这道题目,我来整理一下思路. 首先读懂题意,这n个人是不需要按1到n来一次安排的,也就是说你可以先安排任意一个人. 那么有一种很好排除的情况,那就是对于大于等于i的作为的需 ...
- 【vijos】1286 座位安排(状压dp)
https://vijos.org/p/1286 这题好神不会捉... 首先我们知道所有情况有C(n*m, k)种,这个好搞.但是两两不相邻这个有点难搞.. 原来是状压dp..sigh. 设状态f[i ...
- 座位安排(欧拉回路,高斯消元,bitset)
题面 由于旋转大师 F r e n c h \rm French French 的离去, A r e x t r e \rm Arextre Arextre 光荣地承担了给全班换座位的重任. 由于这是 ...
- 洛谷P2071 座位安排
题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...
- p2071 座位安排
传送门 题目 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置. 输入格式: 第一行,一个正整数N. 第二行至第N*2+1行, ...
- luogu P2071 座位安排
这个题可以被分为两部分 1.匈牙利算法(板子) 2.邻接表存图(好像这不能称为第二部分) 每一排能坐两个人,那就把一排拆成两个点, 用匈牙利算法求最大匹配 每个人都只想坐两排,说明每个人只会连四条边 ...
随机推荐
- 在O(1)时间复杂度删除链表节点
题目描述: 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 1->2->3-> ...
- Charles拦截请求
一.通过Charles抓包,可拦截请求并篡改交互信息 1.可篡改客户端向服务器发起的请求信息(服务器收到的是假消息) 2.可篡改服务器返回给客户端的响应结果(客户端看到的是假消息) 二.篡改用户请求 ...
- Jquery动态添加多行,返回数据至每一行中
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="sys_channel_ed ...
- C#赋值运算符
一.C#赋值运算符 C#语言的赋值运算符用于将一个数据赋予一个变量.属性或者引用.数据可以是常量.变量或者表达式. 1. 简单赋值 “=”操作符被称为简单赋值操作符.在一个简单赋值中,右操作数必须为某 ...
- es6中的类及es5类的实现
目录 类的特点 类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new,如果你将它作为一个函数执行,将会报错. //es6的写法 class Child { constructor() ...
- GIT 团队协作快速入门使用
GIT使用: 1.本地新建一个文件夹 git init 2.克隆远程仓库 git clone git@xxxxx.git 3.本地创建一个dev分支 (前提是服务器端已经创建好有 DEV 分支) gi ...
- php 单冒号 、双冒号的用法
单冒号: 常用与三元运算,如:$result = $str ? $str : $str1; 双冒号: 1,当调用静态属性和静态方法时 2,当调用自身类或者父类的属性或者方法时
- JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Det ...
- Face The Right Way POJ - 3276 (开关问题)
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6707 Accepted: 312 ...
- TCP/IP网络编程之优雅地断开套接字
基于TCP套接字的半关闭 Linux的close函数和Windows的closesocket函数意味着完全断开连接,完全断开连接不仅指无法传输数据,而且也不能接收数据.因此,在某些情况下,通信一方调用 ...