日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/5/22 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [二分][前缀和]洛谷 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 借教室的全部內容,希望文章能夠幫你解決所遇到的問題。

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