差分数组练习1

这几天上课时老师给我们做了两道有关差分数组的题目,请看第一道。

宾馆房间 hotelroom

【题目描述】:

2180年奥运会竞技类分会场,将在XX市举行。会场自然是政府的事情,我们就别操心了。艾瑞克却被兴奋而苦恼的情绪折磨着,他的宾馆是XX市最好的宾馆,近期旅客投宿的订单m份接踵而至,时间从1~n天,这代表着大把大把的银子,可是他最多只能提供k间客房,更多的他只能提前去租附近的房子并赶紧装修一下,时间很紧啊。

艾瑞克找到了他最好的朋友你:“哪,这是所有的订单,你给我在1s内计算出最高峰时,超出多少间客房,这样我才能知道得去租多少房子啊。”

每张订单包含dj,sj,tj:表示从第sj日至第tj日,预定房间dj间。

住:为了简单起见,假设第一天之前宾馆所有的房间都是空的。

 

【输入描述】:

第一行包含两个正整数n,m,k,表示天数、订单的数量,和现有客房数。

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

每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。

 

【输出描述】:

只有一个整数,表示最高峰时还差多少客房,客房足够输出0(骗不到分)。

 

【样例输入】

【样例输出】

4 3 6

2 1 3

3 2 4

4 2 4

3

【数据范围及描述】:

1<=n,m<=1000,0001<=sj<=tj<=n1<=k,dj<=1000

输入数据较大,最好加外挂


解题思路:

刚拿到这个题目的时候我首先想到的是暴力(分块之类的),后来一看数据范围......经过老师的启发我发现这题需要用差分数组来实现。

首先我们读题,要求是区间内加上某个数,并求整个数组中的最大值(即单点查值),而且数据范围是百万级的,所以只能用差分做。

首先我们把所有数读进来后建立一个差分数组,计算第i个数与第i-1个数的差值。在做区间加法时只需将区间中差分数组的第一个数加上读入的加值、将区间后面一个数减去相同的数,这样就相当于区间内的数被整体加了一个值。最后再将差分数组还原,查找最大值即可。


AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,k,d,s,j,ans,sum;
int a[1000005];
int mx(int x,int y){
	return x>y?x:y;
}
int read(){
    int x=0, f=1; char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int main(){
	n=read();m=read();k=read();
	for(int i=1;i<=m;i++){
		d=read();s=read();j=read();
		a[s]+=d;a[j+1]-=d;
	}
	for(int i=1;i<=n;i++){
		sum+=a[i];ans=mx(ans,sum-k);
	}
	printf("%d",ans);
	return 0;
}
AC截图

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值