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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu1529 差分约束(好题)

發(fā)布時(shí)間:2025/6/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu1529 差分约束(好题) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 超市在每個(gè)時(shí)間都有需要的人數(shù)(24小時(shí))比如 1 0 0 0 0 。。。。也就是說(shuō)在第0個(gè)小時(shí)的時(shí)候要用一個(gè)人,其他的時(shí)間都不用人,在給你一些人工作的起始時(shí)間,如果雇傭了這個(gè)人,那么這個(gè)人就會(huì)從自己的其實(shí)時(shí)間工作8個(gè)小時(shí)后離開(kāi),給你需求和可雇傭的員工,問(wèn)你滿足需求超時(shí)最少雇傭多少人。

思路:
? ? ? 經(jīng)典的差分約束,之前嘗試過(guò)很多次都沒(méi)AC,今天終于AC了,現(xiàn)在我們就來(lái)找各種隱含條件。

設(shè):
num[i] 表示第i個(gè)小時(shí)開(kāi)始的有多少個(gè)人。
r[i] 表示第i個(gè)小時(shí)最少雇傭多少人。
s[i] 表示1。。。i小時(shí)開(kāi)始工作的有多少人。 (我們以S為核心建圖)

限制條件:
第i個(gè)小時(shí)雇傭并開(kāi)始工作的人數(shù) >= 0?
則 s[i] - s[i-1] >= 0
第i個(gè)小時(shí)雇傭并開(kāi)始工作的人數(shù) <= num[i]?
則 s[i] - s[i-1] <= num[i] 轉(zhuǎn)化成 s[i-1] - s[i] >= -num[i]
第i個(gè)小時(shí)雇傭的人數(shù) >= r[i]
則 s[i] - s[i-8] >= r[i] ? ? ? ? ? ? ? (i >= 8 && i <= 24)
? ?s[24] + s[i] - s[i + 16] >= r[i] ? ?(i <= 7)

觀察最后一個(gè)不等式,出現(xiàn)了三個(gè)變量,不符合差分約束形式,所以我們就直接二分枚舉
s[24]的值,也就是二分枚舉雇傭人數(shù)的值,這樣就把最后一個(gè)轉(zhuǎn)換成
s[i] - s[i + 16] >= r[i] - mid
最后別忘了還有一個(gè)限制條件就是s[24] - s[0] = mid,=怎么建邊呢?我們可以這樣
s[24] - s[0] >= mid并且 s[24] - s[0] <= mid
第二個(gè)轉(zhuǎn)換成 s[0] - s[24] >= -mid;

這樣就可以二分下去了。。。


#include<stdio.h> #include<string.h> #include<queue>#define N_node 30 #define N_edge 10000 #define INF 1000000000 using namespace std;typedef struct {int to ,cost ,next; }STAR;STAR E[N_edge]; int list[N_node] ,tot; int s_x[N_node]; int r[30] ,num[1100];void add(int a ,int b ,int c) {E[++tot].to = b;E[tot].cost = c;E[tot].next = list[a];list[a] = tot; }bool Spfa(int s ,int n) {for(int i = 0 ;i <= n ;i ++)s_x[i] = -INF;int mark[N_node] = {0};int in[N_node] = {0};s_x[s] = 0;mark[s] = in[s] = 1;queue<int>q;q.push(s);while(!q.empty()){int xin ,tou;tou = q.front();q.pop();mark[tou] = 0;for(int k = list[tou] ;k ;k = E[k].next){xin = E[k].to;if(s_x[xin] < s_x[tou] + E[k].cost){s_x[xin] = s_x[tou] + E[k].cost;if(!mark[xin]){mark[xin] = 1;if(++in[xin] > n) return 0;q.push(xin);}}}}return 1; }bool ok(int mid) {memset(list ,0 ,sizeof(list));tot = 1;for(int i = 1 ;i <= 24 ;i ++){add(i - 1 ,i ,0);add(i ,i - 1 ,-num[i]);if(i >= 8) add(i - 8 ,i ,r[i]);else add(i + 16 ,i ,r[i] - mid);}add(0 ,24 ,mid);add(24 ,0 ,-mid);return Spfa(0 ,24); }int main () {int t ,i ,a ,n;scanf("%d" ,&t);while(t--){for(i = 1 ;i <= 24 ;i ++)scanf("%d" ,&r[i]);scanf("%d" ,&n);memset(num ,0 ,sizeof(num));for(i = 1 ;i <= n ;i ++){scanf("%d" ,&a);num[a+1] ++;}int low ,mid ,up;low = 0 ,up = n;int ans = -1;while(low <= up){mid = (low + up) >> 1;if(ok(mid)){ans = mid;up = mid - 1;}else low = mid + 1;}if(ans == -1) puts("No Solution");else printf("%d\n" ,ans);}return 0; }


總結(jié)

以上是生活随笔為你收集整理的hdu1529 差分约束(好题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。