首页 > 其他分享 >AcWing 503. 借教室(每日一题)

AcWing 503. 借教室(每日一题)

时间:2024-03-13 23:03:08浏览次数:285  
标签:租借 int 教室 mid 订单 满足 503 AcWing

原题链接:503. 借教室 - AcWing题库

在大学期间,经常需要租借教室。

大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。

教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 

面对海量租借教室的信息,我们自然希望编程解决这个问题。

我们需要处理接下来 n 天的借教室信息,其中第 i 天学校有 ri 个教室可供租借。

共有 m 份订单,每份订单用三个正整数描述,分别为 dj,sj,tj,表示某租借者需要从第 sj 天到第 tj 天租借教室(包括第 sj 天和第 tj 天),每天需要租借 dj 个教室。 

我们假定,租借者对教室的大小、地点没有要求。

即对于每份订单,我们只需要每天提供 dj 个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。 

借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。

如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。

这里的无法满足指从第 sj 天到第 tj 天中有至少一天剩余的教室数量不足 dj 个。 

现在我们需要知道,是否会有订单无法完全满足。

如果有,需要通知哪一个申请人修改订单。

输入格式

第一行包含两个正整数 n,m,表示天数和订单的数量。 

第二行包含 n 个正整数,其中第 i 个数为 ri,表示第 i 天可用于租借的教室数量。 

接下来有 m 行,每行包含三个正整数 dj,sj,tj,表示租借的数量,租借开始、结束分别在第几天。 

每行相邻的两个数之间均用一个空格隔开。

天数与订单均用从 1 开始的整数编号。

输出格式

如果所有订单均可满足,则输出只有一行,包含一个整数 0。

否则(订单无法完全满足)输出两行,第一行输出一个负整数 −1,第二行输出需要修改订单的申请人编号。

数据范围

1≤n,m≤10^6
0≤ri,dj≤10^9
1≤sj≤tj≤n

输入样例:

4 3
2 5 4 3
2 1 3
3 2 4
4 2 4

输出样例:

-1
2

解题思路:

此题可用差分+二分或者线段树来解,由于博主能力限制这里会由易懂的差分+二分来讲解。这道题第一感觉应该就是差分了吧,修改区间的值,用差分效率更高一点。我们可以把申请人的需要转化成差分数组,利用前缀和还原,判断i个教室是否满足。如果我们只依靠差分是解决不了此题的,只利用差分时间复杂度为O(nm),大约10^12,肯定会超时,那么我们可以考虑把内层循环利用二分优化掉,具体咋优化呢,我们有了一个申请人编号的差分数组,从第一位申请单到最后一个申请单,越在前面的越容易借到教室,说明教室剩余够多,越到后面剩余可借教室会减少,因为会被前面的申请借去,那就说明第一个不满足的编号越往后概率越高,这样是不是感觉像是一个有序的序列,从头到尾,能满足的概率是由大到小的。那么我们利用二分去查到最后一个能满足的订单,+1即为不能满足的订单,上代码。

#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1e6+5;
int n,m;
LL r[N],d[N],s[N],t[N],c[N];
bool cheak(int mid){//判断第mid个申请是否可以满足
	memset(c,0,sizeof(c));//每次都会有判断,防止上次的数据影响本次的判断
	for(int i=1;i<=mid;i++){//采用申请人由0到差分数组,所以直接差分操作即可
		c[s[i]]+=d[i];
		c[t[i]+1]-=d[i];
	}
	int ans=0;
	for(int i=1;i<=n;i++){//求前缀和,即还原数组
		c[i]+=c[i-1];
		if(c[i]>r[i]){//如果需要的教室大于所能提供的教室,则返回false
			return false;
		}
	}
	return true;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>r[i];
	}
	for(int i=1;i<=m;i++){
		cin>>d[i]>>s[i]>>t[i];
	}
	int l=0,r=m;
	while(l<r){//实行二分查找最大能满足的申请人编号
		int mid=l+r+1>>1;//向上取整
		if(cheak(mid))l=mid;
		else r=mid-1;
	}
	if(r==m){//如果最大满足的编号等于m,说明所有订单均可满足
		cout<<0<<endl;
	}else{
		cout<<-1<<endl<<r+1<<endl;//前面定义的为能满足的最大编号,r+1即为第一个不能满足的编号
	}
	return 0;
}

我们上面代码二分查的是最后一个能满足的订单,那么我们也可以去查找第一个不能满足的订单,大部分代码未变,在二分上改成查找左区间即可。部分代码如下:

while(l<r){
		int mid=l+r>>1;
		if(cheak(mid))r=mid;
		else l=mid+1;
	}
	if (!cheak(m)) {
		cout<<0<<endl;
	}else{
		cout<<-1<<endl<<r<<endl;
	}

博主能力有限,所能即为所写,若有不清楚的地方,欢迎各位大佬指出,一定会进行解答和修正,感谢观看,点个赞支持一下吧!

标签:租借,int,教室,mid,订单,满足,503,AcWing
From: https://blog.csdn.net/m0_73633807/article/details/136677410

相关文章

  • Acwing255.第k小数
    可持久化权值线段树#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#include<cstring>#include<vector>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespace......
  • AcWing 1212. 地宫取宝
    Problem:AcWing1212.地宫取宝文章目录思路解题方法复杂度Code思路这是一个动态规划问题,我们需要找到所有可能的路径,其中每个路径中的宝物价值都是递增的,并且恰好有k个宝物。我们可以使用一个四维的动态规划数组dp[i][j][p][q],其中i和j表示当前的位置,p表示当前......
  • 破链成环-acwing第131场周赛-奶牛报数
    5364.奶牛报数-AcWing题库有 n 头奶牛,围成一圈,顺时针依次编号为 1∼n。其中,第 i 头奶牛的重量为 ai。现在,我们需要选择一头奶牛,并从该奶牛开始,所有奶牛按照顺时针的顺序进行 1∼n报数。报数完毕后,所有报出的数在 [l,r)范围内的奶牛,会被选中制作牛肉。我们希......
  • Acwing166 数独题解 - DFS剪枝优化
    166.数独-AcWing题库题意数独是一种传统益智游戏,你需要把一个9×9的数独补充完整,使得数独中每行、每列、每个3×3的九宫格内数字1∼9均恰好出现一次。请编写一个程序填写数独。思路搜索+剪枝(优化搜索顺序、位运算)优化搜索顺序:很明显,我们肯定是从当前能填合法......
  • ACwing 最短路算法
    ACwing最短路算法首先介绍一下各个最短路算法的分类及适用情况注意:SPFA算法在部分情况下会被卡一些特殊数据,当被卡时,换用其他对应的算法;下面依次介绍:朴素版dijkstra算法朴素版dijkstra算法适用于稠密图,所以我们只以稠密图的存图方式去介绍;核心思想:首先我们定义一个集合st......
  • P1503 鬼子进村 题解
    分析分块。我们定义\(\mathit{cnt}_i\)表示房子\(i\)是否出现过,\(\mathit{sum}_i\)表示在第\(i\)个块内没有被摧毁的房子数量,维护的房子是\((i-1)\timesS-1\)到\(i\timesS\),其中\(S=\sqrt{n}\)也就是块长。操作\(1\)。写一个栈,根据后进先出的特点,讲摧毁的房子......
  • ACWing 247.亚特兰蒂斯
    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;constintN=100010;intn;structSegment{doublex,y1,y2;intk;booloperator<(con......
  • 2024AcWing蓝桥杯集训·每日一题-差分
    1.[AcWing4262.空调]题目描述FarmerJohn的\(N\)头奶牛对他们牛棚的室温非常挑剔。有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。FarmerJohn的牛棚包含一排\(N\)个牛栏,编号为\(1…N\),每个牛栏里有一头牛。第\(i\)头奶牛希望她的牛栏中的温度是\(p_i\),而现......
  • 2024AcWing蓝桥杯集训·每日一题-前缀和
    1.[AcWing562.壁画]题目描述Thanh想在一面被均分为\(N\)段的墙上画一幅精美的壁画。每段墙面都有一个美观评分,这表示它的美观程度(如果它的上面有画的话)。不幸的是,由于洪水泛滥,墙体开始崩溃,所以他需要加快他的作画进度!每天Thanh可以绘制一段墙体。在第一天,他可以自由的......
  • 2024AcWing蓝桥杯集训·每日一题-二分
    1.[AcWing503.借教室]题目描述在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来\(n\)天......