jzoj 6296 NOIP提高組A 投票

2021-09-26 06:18:38 字數 1583 閱讀 6280

詳見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的...