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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JZOJ 5677. 【GDOI2018Day2模拟4.21】纽约

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5677. 【GDOI2018Day2模拟4.21】纽约 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

印度洋暖流溫潤著紐約,四季豐沛的雨水造就了一望無際的大草原。蒙古包是紐約最獨特的一道風景線,每至二月中旬,紐約的土著傣族人民又開始半年一度的轉場了。
由于牲畜和行李過多,牧民 Azone 不得不多次往返于兩個草場之間運輸家當。為了順利轉場,Azone 決定花費 w 元津巴布韋幣,購買一輛載重為 w 的汽車。共有 n 件家具需要搬運,每件家具的重量為 wi 。Azone 每次出發前,會搬若干件總重不超過 w 的物品上車:出發前,車是空載的,Azone 會選擇能搬上車的家具中最重的一件放上車(即該家具之前還未運走且放置該家具后汽車不會超載),然后在剩下的家具中繼續選擇一件能被搬走的最重的上車,持續裝車,直至剩下的家具都塞不上車。裝載完畢后,Azone 會開車運走這些家具,卸在目的地,再駕空車返回繼續運送,直至轉場完畢。
Azone 希望在運送次數不超過 R 的情況下完成轉場,求 Azone 最少需要購置價值多少的車。

Input

第一行,兩個整數 n 和 R,分別表示家具件數及最多運送次數。
第二行,若干個整數 wi ,表示家具重量。

Output

一行,表示答案。

Sample Input

6 2
26 7 10 30 5 4

Sample Output

42

Data Constraint

subtask 1 60pts,R,n,w i ≤ 20。
subtask 2 40pts,沒有額外限制。
對于100% 的數據,1 ≤ R,n,wi ≤ 2000。

Solution

  • 考場上看到這題,哇,二分答案啊,拍都沒拍就交了。

  • 結果——WA 60分!

  • 不能直接二分啊!

  • 對于本題,我們并不能證明對于一個合法容量 WW+1 也合法(剛好卡住的情況)。

  • 我們設最優答案為 C ,再令 mx=Max{wi}

  • 于是我們可以證明所有 WC+wi 一定合法(因為每次都一定可以多裝點)。

  • 那么我們隨便二分一個答案 T (注意不一定 T 就是最優的)。

  • 此時所有 W<T?mx 一定不合法。

  • 那么我們暴力檢驗 mx 個,在區間 [T?mx,T] 中選一個最優的即可。

  • 在判斷一個容量 W 是否合法時,

  • 可以用一個 multiset 每次 O(logN) 的查找出能裝的最大的那個。

  • 即可以 O(N?log?N) 判斷。

  • 時間復雜度 O(N2?log?N)

Code

#include<cstdio> #include<cctype> #include<set> using namespace std; const int N=2005; int n,R,mx,ans; int w[N]; multiset<int>s; multiset<int>::iterator it; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48),ch=getchar();return w?-X:X; } inline int max(int x,int y) {return x>y?x:y; } inline bool check(int x) {s.clear();for(int i=1;i<=n;i++) s.insert(w[i]);int cnt=0;while(!s.empty()){int sum=x;while(!s.empty() && sum>=*s.begin()){it=s.upper_bound(sum);it--;sum-=*it;s.erase(it);}if(++cnt>R) break;}return cnt<=R; } int main() {freopen("newyork.in","r",stdin);freopen("newyork.out","w",stdout);n=read(),R=read();int l=0,r=0;for(int i=1;i<=n;i++){r+=w[i]=read();mx=max(mx,w[i]);}while(l<=r){int mid=l+r>>1;if(check(mid)){r=mid-1;ans=mid;}else l=mid+1;}for(int i=ans-mx;i<ans;i++)if(check(i)) return 0&printf("%d\n",i);printf("%d\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 5677. 【GDOI2018Day2模拟4.21】纽约的全部內容,希望文章能夠幫你解決所遇到的問題。

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