SDOI2015 星際戰爭(網路流)

2022-05-20 16:46:05 字數 1759 閱讀 3134

由於時間可能是小數,所以不能直接跑。

先二分答案為 ttt。

s

ss 向每個雷射** i

ii 連一條容量為 bi×

tb_i\times t

bi​×

t 的邊,表示這個雷射**最多能輸出多少。

然後每個機械人向 t

tt 連一條容量為 a

ia_i

ai​ 的邊,表示這個機械人至少需要這麼多攻擊才能被摧毀。

接著每個雷射**向每個它能攻擊的機械人連一條容量為 inf

⁡\inf

inf 的邊。

然後跑最大流看流量等不等於所有機械人的血量之和。

因為時間是小數,所以二分的時候時間和機械人血量先乘上個 103

10^3

103,最後輸出的時候再除就好了。

**:

#include

#define n 55

#define ll long long

#define lnf 0x7fffffffffffffff

using

namespace std;

int n,m,s,t;

int a[n]

,b[n]

;int cnt=

1,head[n<<1]

,cur[n<<1]

,to[

(n*n+

(n<<1)

)<<1]

,nxt[

(n*n+

(n<<1)

)<<1]

;int stcnt,sthead[n<<1]

;int num[n<<1]

;ll sum;

ll c[

(n*n+

(n<<1)

)<<1]

,stc[

(n*n+

(n<<1)

)<<1]

;queue<

int>q;

void

adde

(int u,

int v,ll ci)

bool

bfs()}

}return num[t]!=-

1;}ll dfs

(int u,ll minflow)

}return preflow;

}ll dinic()

bool

check

(int x)

return

dinic()

==sum;

}int

main()

for(

int i=

1;i<=m;i++

)scanf

("%d"

,&b[i]);

for(

int i=

1;i<=m;i++)}

} stcnt=cnt;

memcpy

(sthead,head,

sizeof

(sthead));

memcpy

(stc,c,

sizeof

(stc));

int l=

0,r=

1000000000

,ans;

while

(l<=r)

printf

("%lf\n"

,1.0

*ans/

1000);

return0;

}

SDOI2015 星際戰爭

題目傳送門 看了標籤恍然大悟 我們可以二分所用的時間 t 然後對於每乙個 從源點向它們連長度為傷害 times t 的邊,然後 向它們能攻擊的敵人連長度為 inf 的邊,對於每個敵人,向匯點連長度為它們血量的邊 然後跑最大流即可 因為要至少保留 2 位小數,為了便於處理,將所有生命和時間都乘了 10...

SDOI2015第1輪第2試 星際戰爭

3333年,在銀河系的某星球上,x軍團和y軍團正在激烈地作戰。在戰鬥的某一階段,y軍團一共派遣了n個巨型機械人進攻x軍團的陣地,其中第i個巨型機械人的裝甲值為ai。當乙個巨型機械人的裝甲值減少到0或者以下時,這個巨型機械人就被摧毀了。x軍團有m個雷射 其中第i個雷射 每秒可以削減乙個巨型機械人bi的...

3993 SDOI2015 星際戰爭

time limit 10 sec memory limit 128 mbsec special judge submit 1069 solved 489 submit status discuss 3333年,在銀河系的某星球上,x軍團和y軍團正在激烈地作戰。在戰鬥的某一階段,y軍團一共派遣了n個...