詳見oj
考場就剛\(t1\)了。。。
首先打了個暴力:\(dfs\)列舉選哪些數,然後\(k^2dp\)求出答案。
設\(f[i][j]\)表示前\(i\)個人有\(j\)個選好的方案數。答案即為\(f[k][k/2]\)。
從題解發現,選的人是一段字首和一段字尾。
茹氏證明:
我們可以固定\(k-1\)個人以及他們選什麼。
我們設\(s1\)表示有\(k/2-1\)人選好,\(k/2\)人選壞的概率。
\(s2\)表示\(k/2\)人選好,\(k/2-1\)人選壞的概率。
那麼對於答案,即為\(s1*p+s2*(1-p)\)。
若\(s1>s2\),那麼肯定的我們要使p盡可能大,反之亦然。
不斷如此,結果選的人一定為一段字首和一段字尾。
用dp求解即可。
#include #include #define n 2010
#define db double
#define mem(x, a) memset(x, a, sizeof x)
#define fo(x, a, b) for (int x = a; x <= b; x++)
#define fd(x, a, b) for (int x = a; x >= b; x--)
using namespace std;
int n, k;
db p[n], f[n][n], g[n][n], s, ans;
inline bool cmp(db x, db y)
int main()
g[n + 1][0] = 1;
fd(i, n, n - k + 1)
fo(i, 0, k)
printf("%.9lf\n", ans);
return 0;
}
該題好像滿足三分性,但我不會證,以下**ac了:
#include #include #define n 2010
#define db double
#define mem(x, a) memset(x, a, sizeof x)
#define fo(x, a, b) for (int x = a; x <= b; x++)
#define fd(x, a, b) for (int x = a; x >= b; x--)
using namespace std;
int n, k, cs, now;
db p[n], f[n][n], c[n], s, s1, ans;
inline bool cmp(db x, db y)
void solve()
}}int main()
}fo(i, 1, l) c[i] = p[i];
fo(i, l + 1, k) c[i] = p[n - k + i];
solve(); s = f[k][k / 2];
if (s > ans) ans = s;
printf("%.9lf\n", ans);
return 0;
}
JZOJ 6276 noip提高組模擬1 樹
d es crip tion description descri ptio n 求樹上不經過給定數對的路徑數對個數 資料範圍 節點個數n 1 05n leq 10 5 n 10 5,給定數對個數 m 1 05m leq 10 5 m 105sol utio nsolution soluti on考...
NOIP提高組 矩陣
在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...
NOIP提高組2005 過河
過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...