日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[二分][前缀和]洛谷 P1083 借教室

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [二分][前缀和]洛谷 P1083 借教室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:
有n天,m個請求。n天內每天的可用教室為a_ia?i??個,m個請求是從l到r天租借t個教室。 如果某一天的教室分配無法滿足,則輸出當前的訂單號。


思考:

一開始根本沒想到這個東西怎么二分。。

瞄了一眼題解才發現自己太弱。。。

首先要找單調性,因為只有具有單調性質的東西才能二分判斷可行解。

在對題目分析了之后,我們發現就只有 每天租借教室的數量、訂單的數量。

所以只能對訂單的數量二分,每次二分一個訂單的最大值,判斷是否可行。

可行則擴大,不可行則縮小。

感覺usaco的題目和NOIP的題目都比較有思維的難度,一般在于題目建模與轉化,所以需要多加訓練和思考!!!

?

#include <stdio.h> #include <algorithm> using namespace std; typedef long long ll;const int Maxn = 1000005;int Min = 0x3f3f3f3f; int Day,need; int num[Maxn]; int Rent[Maxn],Start[Maxn],End[Maxn]; ll Sum[Maxn];bool Check(int m){for(int i=0;i<=Day;++i) Sum[i] = 0;for(int i=1;i<=m;++i){Sum[Start[i]]+=Rent[i];Sum[End[i]+1]-=Rent[i];}ll now = 0;for(int i=1;i<=Day;++i){now+=Sum[i];if(now > num[i]){Min = min(Min,m);return true;}}return false; }int main(){scanf("%d%d",&Day,&need);for(int i=1;i<=Day;++i){scanf("%d",&num[i]);}for(int i=1;i<=need;++i){scanf("%d%d%d",&Rent[i],&Start[i],&End[i]);}if( !Check(need) ){printf("0\n");return 0;}else{int l = 1 , r = need+1;while( l < r){int m = (l+r)>>1;if( Check(m) ) r = m;else l = m + 1;}printf("-1\n%d\n",Min);}return 0; }

?

轉載于:https://www.cnblogs.com/OIerLYF/p/7792614.html

總結

以上是生活随笔為你收集整理的[二分][前缀和]洛谷 P1083 借教室的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。