借教室(洛谷-P1083)
题目描述
在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。
面对海量租借教室的信息,我们自然希望编程解决这个问题。
我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。
我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。
借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。
现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改订单。
输入输出格式
输入格式:
第一行包含两个正整数n,m,表示天数和订单的数量。
第二行包含n个正整数,其中第i个数为ri,表示第ii天可用于租借的教室数量。
接下来有m行,每行包含三个正整数dj,sj,tj,表示租借的数量,租借开始、结束分别在第几天。
每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。
输出格式:
如果所有订单均可满足,则输出只有一行,包含一个整数0。否则(订单无法完全满足)
输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。
输入输出样例
首先,判断当前状态所有任务是否能够满足每天借教室的量在允许范围内,然后用差分数组记录当前状态在每天对教室的总需求与前一天的差值,那么很容易求得每一天的实际值:n[i]=sum(f[i])
然后与当天允许的教室数量进行比较,若大于提供量,则不可借出,之后检测 m 种任务能否同时执行,若可行则直接输出0,若不可行就二分答案,直到该状态所有任务都可满足
源代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-9
#define INF 0x3f3f3f3f
#define LL long long
const int MOD=1000000007;
const int N=1000000+5;
const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1};
using namespace std;int n,m;
struct Node{int num;//要租借的数量int start,endd;//租借开始与结束时间
}a[N];
int f[N];
int admit[N];//每天允许借出数量
bool judge(int x){//判断m个订单能否同时执行memset(f,0,sizeof(f));for(int i=1;i<=x;i++){//差分数组f[a[i].start]+=a[i].num;f[a[i].endd+1]-=a[i].num;}int sum=0;for(int i=1;i<=n;i++){//查询第i天的值sum+=f[i];if(sum>admit[i])return false;}return true;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&admit[i]);for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].num,&a[i].start,&a[i].endd);if(judge(m))printf("0\n");else{//二分答案int left=1,right=m;while(left<right){int mid=(left+right)/2;if(judge(mid)) left=mid+1;else right=mid;}printf("-1\n%d\n",left);}return 0;
}
借教室(洛谷-P1083)相关推荐
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- [二分][前缀和]洛谷 P1083 借教室
题意: 有n天,m个请求.n天内每天的可用教室为a_iai个,m个请求是从l到r天租借t个教室. 如果某一天的教室分配无法满足,则输出当前的订单号. 思考: 一开始根本没想到这个东西怎么二分.. ...
- P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...
- P1083 借教室(差分+二分)
https://www.luogu.org/problem/P1083 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教 ...
- 洛谷or牛客数据结构+算法
栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...
- 洛谷P2161 [SHOI2009]Booking 会场预约
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- 洛谷 - 试炼场(全部题目备份)
整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...
- 洛谷——P1056 排座椅
题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳. 同 ...
- 二分答案——yyy2015c01 的 U 盘(洛谷 P2370)
题目选自洛谷P2370 两种解法,01背包+排序,或是直接二分即可 写了二分最后只有40的分...刚好过了给的四个样例 哭辽~想了半天不知道哪里错了 题目背景 在 2020 年的某一天,我们的 yyy ...
最新文章
- python的代码编译、代码打包方法
- winscp linux中文文件夹名称乱码,解决windows传送到linux下中文文件名及文件内容乱码问题...
- alteon ad3 配置
- linux未知的类型名 FILE,smb使用 ------转载自http://blog.csdn.net/tlaff/article/details/5463068...
- 语言工程中有趣的事情
- php充值注入,PHP注入一路小跑
- Battle Encoder Shirase一款能限制进程CPU占有率的小东西
- 怎么样减少电脑对人的辐射
- [Redis]c# redis缓存辅助类
- Node.js 0.8.20 稳定版发布
- H5页面调起手机打电话功能
- 完全平方数-动态规划
- 两个路由器互连设置方法
- Android 调用地图导航
- C语言数字图像处理---1.2 彩色图像灰度化和二值化
- 安装ubuntu16.04 14.04 登录时一直显示紫色问题
- python期末考试试卷及答案_python期末考试复习试卷
- Android Clock控件
- 加密锁(加密狗)使用技巧
- 51单片机之程序模块化
热门文章
- 一周学C#第五天——命名空间
- 2K/XP/2003 系统登录密码破解
- 【转】[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理...
- WinAPI: midiOutClose - 关闭输出设备
- 56秒看完131年英格兰顶级联赛冠军排行:利物浦时隔30年再夺冠
- linux 制作yum,Linux制作本地yum
- java 可选参数_超干货详解:kotlin(4) java转kotlin潜规则
- 不得不说,其实你的性能优化手段已经过时了
- sap commit rollback
- 在 MyEclipse 5.1GA 上使用 XFire 编写 Web Service