在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要 向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。
面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。
我們需要處理接下來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,第二行輸出需要修改訂單的申請人編號。
4 32 5 4 3
2 1 3
3 2 4
4 2 4-12
luogu:
二分,差分
若干天中,每天有一些教室空出。現在給出若干訂單,每乙個訂單都是要一段連續天數的固定數量教室。現在求到第幾個訂單會不滿足要求
因為如果有乙個訂單不滿足要求,會導致後面的訂單都不滿足要求,這個符合單調性原理。所以我們可以二分滿足到第幾個訂單。而對於每一次檢查從1~mid的訂單,我們用差分來處理,將訂單的第一天加上要借的教室數,最後一天的後一天減去要借的教室數。然後從前往後累加一遍,如果出現任意一天不滿足情況時,記錄答案。
#include#include#include#include#includeusing namespace std;
const int maxn=2000000;
const int inf=2147483647;
#define ll long long
int n,m;
int ans;
int op[maxn];//訂單開始的時間
int ed[maxn];//訂單結束的時間
int num[maxn];//訂單要借的教室數
ll sum[maxn];//統計差分
int classroom[maxn];//每一天能夠借出的教室數
int read();
bool check(int end);
int main()
if (check(m))//當最後乙個訂單都可以滿足時,直接輸出可以並退出
int l=1,r=m;//二分
dowhile (l'9')||(ch<'0'))
ch=getchar();
while ((ch<='9')&&(ch>='0'))
return x;
}bool check(int end)
ll now=0;
for (int i=1;i<=n;i++)//累計字首和
}return 1;
}
題解 LuoGu1083 借教室
原題傳送門 剛開始我想到了差分方法 可以o n o n o n 檢驗是否所有訂單均可滿足 然後我就想到這道題是否和飛揚的小鳥一樣的套路再去用什麼方法找到第乙個不能滿足的點 發現答案滿足二分性,那麼就直接二分好了,然後每次都用差分陣列o n check o n text o n check 把所有均可...
洛谷 P1083 借教室 二分 差分
題意 思路 首先可以看出這是乙個比較典型的差分,首先是離線,然後在區間l,r增加幾,這些都是差分的特徵,那麼現在問題就是,怎樣差分?我們可以看出天數是具有單調性的,當在第x天不行的時候那麼x 1肯定也不行,由此可以看出天數是具有二分的特性的,所以我們可以二分天數。include using name...
洛谷P1083 借教室 二分 差分
n天,每天有r i 個教室出租,一共m個訂單,按照先後順序,每個訂單從s天開始到t天結束,每天要借d個,如果所有訂單都能完成,輸出0,哪天教室不夠,輸出到那個訂單的單號。二分可以完成到第幾個訂單,對於每個二分的值,進行差分到這個訂單為止所有的天數,求下字首和,就可以得出對於每一天有沒有超出借出的教室...