帶着水印,不想截圖ios
小遲的比賽
game.in/.out/.cpp
【問題描述】
⼩遲最近去參加了⼀個錦標賽,這個錦標賽總共有 n 輪⽐賽,最終成
績由這 n 輪⽐賽中贏的輪數決定。⾄於⼩遲每⼀輪⽐賽的勝利機率,則取
決於他在該輪⽐賽以前的戰績。也就是說,若是⼩遲在第 i 輪⽐賽選擇積極
應戰,而且前 i-1 輪⽐賽中取得了 j 勝的話,那麼第 i 輪⽐賽的勝率機率爲
p[i][j],這⾥咱們保證了⼀點就是對於同⼀個 i,p[i][j] 關於 j 的上升保持單
調不上升(也就是說 p[i][j]<p[i][j+1])。
⼩遲觀察到這個規則以後,想到了⼀個可能可使他最終成績更優的⽅
法,就是在某些輪⽐賽採起第⼆種策略,故意求敗,也就是以 100% 的機率
輸掉該輪⽐賽,從⽽使⾃⼰在後⾯可以遇到更容易對付的對⼿。
⼩遲如今已經看到了整個 p 數組,⼩遲但願你能告訴他⼀個最優的策
略,使得他能最⼤化他的指望贏的輪數。這⾥,定義⼀下指望。假如咱們要
求⼀個事件 A 的指望,那麼假如事件 A 以 Pi 的機率結果爲 i,那麼事件 A
的指望則是 i*Pi 的和,⼤概的含義就是結果值關於機率的⼀個加權平均數c++
輸入格式】
輸⼊⽂件名爲 game.in。
輸⼊數據第⼀⾏爲輪數 n,n 爲正整數。
接下來的 n ⾏,第 i ⾏有 i 個實數,表⽰對應的 p[i][0],....p[i][i-1].
【輸出格式】
輸出⽂件名爲 game.out。
⼀⾏⼀個實數,表⽰最優策略下指望贏的輪數,保留兩位⼩數。
【樣例輸入】
2
3
0.5
0.5 0.5
【樣例輸出】
1.00
【樣例解釋】
因爲咱們看到對於第 i 輪,⽆論以前戰績如何,勝率都是相同的,所以,
咱們的最優策略應當是每⼀輪努⼒求勝。
而後,第⼀輪,若是咱們贏了,機率爲 0.5,輸了的機率也爲 0.5.
若是第⼀輪贏了,第⼆輪又贏了,機率爲 0.5*0.5=0.25,贏兩盤;
若是第⼀輪贏了,第⼆輪輸了,機率爲 0.5*(1-0.5)=0.25,贏⼀盤;
若是第⼀輪輸了,第⼆輪贏了,機率爲 (1-0.5)*0.5=0.25, 贏⼀盤;
若是兩輪都輸了,機率爲 (1-0.5)*(1-0.5)=0.25, 贏零盤。
故指望贏的輪數爲 0.25*2+(0.25+0.25)*1+0.25*0=1.
【數據規模及約定】
對於 30% 的數據,n≤ 2.
對於 100% 的數據,1≤n≤1000,0≤p[i][j]≤1.數組
#include <bits/stdc++.h> using namespace std; const int maxn=1000+15; int n; double p[maxn][maxn]; double f[maxn][maxn]; int main() { freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=0;j<i;j++) scanf("%lf",&p[i][j]); f[0][0]=1; for (int i=0;i<n;i++) for (int j=0;j<=i;j++) { f[i+1][j+1]+=f[i][j]*p[i+1][j]; f[i+1][j]+=f[i][j]*(1-p[i+1][j]); } double ans=0; for (int j=0;j<=n;j++) ans+=j*f[n][j]; printf("%.2lf\n",ans); return 0; }
Yuno like cake
cake.in/.out/.cpp
【問題描述】
雙⼗⼀就要來啦!⽽ Yuno 剛剛得到了⼀筆 X 元的獎⾦。那麼是否是
應該清空下購物車呢?
購物車總共有 N 個物品,每一個物品的價格爲 V i ,Yuno 想盡量地把
⼿頭的獎⾦給花光,因此她要精⼼選擇⼀些商品,使得其價格總和最接近但
又不會超過獎⾦的⾦額。那麼 Yuno 最後最少能夠剩下多少錢呢?大數據
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map> #include <bits/stdc++.h> using namespace std; #define gc getchar() inline int read() { int x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x; } const int N = 45; #define LL long long LL a[N]; LL n, X; LL num1[1200000], num2[1200000], tot1, tot2; bool Cmp(LL aa, LL ba) { return aa > ba; } LL b[10000]; int main() { n = read(), X = read(); for(int i = 1; i <= n; i ++) a[i] = read(); sort(a + 1, a + n + 1); int n1 = n / 2, n2 = n - n1; int to = (1 << n1) - 1; for(int t = 1; t <= to; t ++) { LL num = 0; for(int i = 0; (1 << i) <= t; i ++) { if(t & (1 << i)) num += a[i + 1]; } num1[++ tot1] = num; } to = (1 << n2) - 1; for(int t = 1; t <= to; t ++) { LL num = 0; for(int i = 0; (1 << i) <= t; i ++) { if(t & (1 << i)) num += a[n1 + i + 1]; } num2[++ tot2] = num; } sort(num1 + 1, num1 + tot1 + 1); sort(num2 + 1, num2 + tot2 + 1, Cmp); LL Min = 1e18; for(int i = 1; i <= tot1; i ++) if(num1[i] == X) { cout << 0; return 0; } else if(num1[i] < X) { Min = min(Min, X - num1[i]); } for(int i = 1; i <= tot2; i ++) if(num2[i] == X) { cout << 0; return 0; } else if(num2[i] < X) { Min = min(Min, X - num2[i]); } int t1 = tot1; int t2 = tot2; while(t1 >= 1 && t2 >= 1) { while(num1[t1] + num2[t2] > X && t1 >= 1) { t1 --; } if(t1 == 0) break; Min = min(Min, X - num1[t1] - num2[t2]); t2 --; } cout << Min; return 0; }
T3:spa
-------------------------------------------------------------------------------------------------------------------code
這是最近的考試本身想作卻又在最後很是無力的一場考試。。。。。。blog
主要在T2,因爲T1沒作出來(vegetable排序
因此當時一心想着AT2,生成大數據對拍事件
一直沒發現排序cmp() 傳的int類型get
那這就排不了序了。。。
查了很長很長時間,最後很慌致使數組開小,gg
然而,數據太水了,沒爆int