由於時間可能是小數,所以不能直接跑。
先二分答案為 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個...