這道題太明顯了,一眼看過去就知道是0/1分數規劃。
先用二分列舉mid,假設mid就是c
我們要判斷的是
a 1+
a2+.
..+a
nb1+
b2+.
..+b
n>=c
\frac>=c
b1+b2
+...
+bn
a1+
a2+
...+
an
>=c
然後我們就可以把分母乘到c上面去,得到
a 1+
a2+.
..+a
n>=c
(b1+
b2+.
..+b
n)
a_1+a_2+...+a_n>=c(b_1+b2+...+b_n)
a1+a2
+..
.+an
>=c
(b1
+b2+
...+
bn)
這樣以後化簡完不就沒得做了嗎?
如果做過很多道0/1分數規劃的題一定會知道用圖論來求,那麼我們就可以把每一項a和b放在一起,得到
( a1
−c∗b
1)+(
a2−c
∗b2)
+...
+(an
−c∗b
n)
>=0
(a_1-c*b_1)+(a_2-c*b_2)+...+(a_n-c*bn)>=0
(a1−c
∗b1
)+(a
2−c
∗b2
)+..
.+(a
n−c
∗bn)
>=0
然後我們把男生和女生之間都連一條邊,這條邊流量為1,費用為a[j
][j]
−c∗b
[i][
j]
a[j][j]-c*b[i][j]
a[j][j
]−c∗
b[i]
[j],用最大費用最大流跑一遍,看看最大的費用是否大於0即可
參考**
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define eps 1e-8
using
namespace std;
const
int n =
2e2+
6, m =
2e5+6;
int tot, head[n<<1]
, ver[m<<1]
, w[m<<1]
, cur[n<<1]
, next[m<<1]
;double leng[m<<1]
;int mark[n<<1]
, vis[n<<1]
, s, t, n;
double dis[n<<1]
, ans, a[n]
[n], b[n]
[n];
void
add(
int x,
int y,
int w,
double d)
bool
spfa()
}}return dis[t]
!=-inf;
}int
dfs(
int x,
int now)}}
return val;
}void
zkw()}
}bool
check
(double x)
intmain()
printf
("%.6lf\n"
, ans)
;return0;
}
題解 LOJ2004 SDOI2017 硬幣遊戲
考慮建出ac自動機。則問題相當於,我們每步會從節點 i 等概率地走向 text i,0 或 text i,1 給定了乙個起點和若干個終點,求從每個終點結束的概率。因為到達乙個終點後遊戲就結束了,我們不會繼續走,所以每個終點被經過的次數要麼是 0 要麼是 1 因此,從每個終點結束的概率,在數值上就等於...
LOJ2002 SDOI2017 序列計數
loj 洛谷 考慮補集轉換,用所有數減去只用合數的方案數,我們先考慮算所有數的 首先可以得到乙個普及組 rm dp f 表示當前填了前 i 個,總和 p 為 j 的方案數。記錄乙個 cnt i 表示 p 為 i 的數的個數。轉移就是 f sum f p cdot cnt k 然後我們拿矩陣大力優化這...
LOJ 2270 SDOI 2017 天才黑客
給出一張 n 個點,m 條邊的圖以及乙個大小為 k 的字典樹,每條邊有 x,y 的權值,一條路徑的權值就是上面所有邊的 x 之和 相鄰兩條邊在字典樹上的 lca 的深度之和。求 1 到每個點的最短路。對於 100 的資料,t leq 10 2 leq n leq 50000 1 leq m leq ...