POJ3762 時間段用k次

2021-06-27 04:16:41 字數 1868 閱讀 9958

題意:

有n個任務,每個任務有自己的開始時間和結束時間,還有完成這個任務能獲得的價值,然後每一天的同乙個時刻只能執行乙個任務,每個任務必須連續執行完成,最多可以工作m天,問這m天能獲得的最大價值。

思路:一開始沒想太多,直接建立乙個圖,然後tle了,先說下我tle的那個吧!,邏輯上應該沒錯,是時間過不起,我是先把每乙個點差點,拆成兩個,流量1,費用是他的價值,然後虛擬出來乙個點,連線所有點,流量是1,意思是所有點都可以作為這一天的開始,然後每乙個點都連線幹完這個活之後可以在幹的另乙個活,流量是1,費用0,最後所有的點在連線終點,流量1,費用0,意思是每乙個點都可以作為這一天的最後乙個任務,然後在超級源點那在虛擬出來乙個點,和起點連線,流量m費用0,意思最多可以幹m天,結果tle了,現在說下官方題解,官方題解也非常簡單容易理解,是這樣的,我們可以吧所有涉及的時間點都拿出來,然後sort離散化一下,然後得到乙個<=n*2的點集,(《是因為可能有重複的時間點),把這一串點集全都連線上,i->i+1 流量是inf,費用是0,這樣的目的是任意兩個任務之間雖然沒有交集,但是也可以用0花費連線起來,然後對於每乙個任務,他的起點和終點都對應著離散化之後的某兩個點,然後把這兩個點之間倆接一條邊,流量1,費用是這個任務的價值,最後再在第乙個點之前虛擬出來乙個點s連線第乙個點,流量是m費用是0,限制天數用的,然後在在最後乙個離散化後的點連線乙個虛擬的t(這個虛擬的t可以不用,我個人習慣,於是就用了),最後一遍費用流就行了。官方的這個做法的邊數是n的,我的那個是n*n的,n的這個我的都跑了1300多了,n*n的必然tle了。

#include

#include

#include

#include

#include

#define n_node 5000

#define n_edge 50000

#define inf 1000000000

using namespace std;

typedef struct

star;

typedef struct

node;

star e[n_edge];

node node[2200];

int list[n_node] ,tot;

int mer[n_node] ,s_x[n_node] ,mark[n_node];

int num[n_node];

maphash;

void add(int a ,int b ,int c ,int d)

bool spfa(int s ,int t ,int n)}}

}return mer[t] != -1;

}int m_c_flow(int s ,int t ,int n)

maxflow += minflow;

}return maxcost;

}int main ()

sort(num + 1 ,num + nowid + 1);

int now = 0;

for(i = 1 ;i <= nowid ;i ++)

memset(list ,0 ,sizeof(list)) ,tot = 1;

add(0 ,1 ,0 ,m);

for(i = 2 ;i <= now ;i ++)

add(i - 1 ,i ,0 ,inf);

add(now ,now + 1 ,0 ,m);

for(int i = 1 ;i <= n ;i ++)

add(hash[node[i].a] ,hash[node[i].b] ,node[i].c ,1);

int ans = m_c_flow(0 ,now + 1 ,now + 1);

printf("%d\n" ,ans);

}return 0;

}

查詢一時間段內的月份

查詢某一時間段內的所有月份,可以 如下 方法一 declare date1 varchar 10 date2 varchar 10 set date1 2010 01 01 set date2 2010 12 01 select convert varchar 7 cast ltrim year d...

判斷某一時間在某個時間段內

判斷當前時間是否在 starttime,endtime 區間,注意時間格式要一致 param submissiondate 當前時間 param starttime 開始時間 資料庫查出來 param endtime 結束時間 查出來 public static boolean iseffectiv...

Date 判斷某一時間時間是否在時間段內

判斷時間是否在時間段內 param date 當前時間 yyyy mm dd hh mm ss param strdatebegin 開始時間 00 00 00 param strdateend 結束時間 00 05 00 return public static boolean isindate ...