58-56: 模擬賽

帶着水印,不想截圖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

[FJOI2017]矩陣填數

-------------------------------------------------------------------------------------------------------------------code

 

這是最近的考試本身想作卻又在最後很是無力的一場考試。。。。。。blog

主要在T2,因爲T1沒作出來(vegetable排序

因此當時一心想着AT2,生成大數據對拍事件

一直沒發現排序cmp() 傳的int類型get

那這就排不了序了。。。

查了很長很長時間,最後很慌致使數組開小,gg

然而,數據太水了,沒爆int

相關文章
相關標籤/搜索