[SCOI2008] 奖励关
題目背景
08四川NOI省選
題目描述
你正在玩你最喜歡的電子游戲,并且剛剛進(jìn)入一個(gè)獎(jiǎng)勵(lì)關(guān)。在這個(gè)獎(jiǎng)勵(lì)關(guān)里,系統(tǒng)將依次隨機(jī)拋出k次寶物,每次你都可以選擇吃或者不吃(必須在拋出下一個(gè)寶物之前做出選擇,且現(xiàn)在決定不吃的寶物以后也不能再吃)。
寶物一共有n種,系統(tǒng)每次拋出這n種寶物的概率都相同且相互獨(dú)立。也就是說,即使前k-1 次系統(tǒng)都拋出寶物1(這種情況是有可能出現(xiàn)的,盡管概率非常小),第k次拋出各個(gè)寶物的概率依然均為1/n。
獲取第 i 種寶物將得到Pi分,但并不是每種寶物都是可以隨意獲取的。第i種寶物有一個(gè)前提寶物集合Si。只有當(dāng)Si中所有寶物都至少吃過一次,才能吃第i 種寶物(如果系統(tǒng)拋出了一個(gè)目前不能吃的寶物,相當(dāng)于白白的損失了一次機(jī)會(huì))。注意,Pi 可以是負(fù)數(shù),但如果它是很多高分寶物的前提,損失短期利益而吃掉這個(gè)負(fù)分寶物將獲得更大的長期利益。
假設(shè)你采取最優(yōu)策略,平均情況你一共能在獎(jiǎng)勵(lì)關(guān)得到多少分值?
輸入輸出格式
輸入格式:
?
第一行為兩個(gè)正整數(shù)k 和n,即寶物的數(shù)量和種類。以下n行分別描述一種
寶物,其中第一個(gè)整數(shù)代表分值,隨后的整數(shù)依次代表該寶物的各個(gè)前提寶物(各
寶物編號(hào)為1到n),以0結(jié)尾。
?
輸出格式:
?
輸出一個(gè)實(shí)數(shù),保留六位小數(shù),即在最優(yōu)策略下平均情況的得分。
?
輸入輸出樣例
輸入樣例#1:?1 2 1 0 2 0 輸出樣例#1:?
1.500000 輸入樣例#2:?
6 6 12 2 3 4 5 0 15 5 0 -2 2 4 5 0 -11 2 5 0 5 0 1 2 4 5 0 輸出樣例#2:?
10.023470
說明
1 <= k <= 100, 1 <= n <= 15,分值為[-106,106]內(nèi)的整數(shù)。
?
? ? 子集上dp,對(duì)后繼期望取max即可。
#include<bits/stdc++.h> #define ll long long #define D double using namespace std; int ci[25],n,k,pre[25],val[25],now; D f[105][40005],tmp;inline void solve(){tmp=1/(D)n;for(int i=k-1;i>=0;i--)for(int j=0;j<ci[n];j++)for(int l=0;l<n;l++){if((pre[l]&j)==pre[l]) f[i][j]+=tmp*max(f[i+1][j|ci[l]]+val[l],f[i+1][j]);else f[i][j]+=tmp*f[i+1][j];} }int main(){ci[0]=1;for(int i=1;i<=20;i++) ci[i]=ci[i-1]<<1;scanf("%d%d",&k,&n);for(int i=0;i<n;i++){scanf("%d",val+i);while(scanf("%d",&now)==1&&now) pre[i]|=ci[now-1];}solve();printf("%.6lf\n",f[0][0]);return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/JYYHH/p/8920311.html
總結(jié)
以上是生活随笔為你收集整理的[SCOI2008] 奖励关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java环境配置(linux安装jdk8
- 下一篇: golang 接口类型 interfac