IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [PKUSC2022]撸猫——Hall定理 -> 正文阅读

[数据结构与算法][PKUSC2022]撸猫——Hall定理

原题链接也许没寄吧

题目描述

作为一位喜欢猫的人,小 B 家里养了 n n n 只猫。这些猫从 1 1 1 n n n 标号。

他每天最喜欢的时候就是撸猫,可惜猫猫并不是每天都愿意被他撸。愿意被他撸的猫猫集合 S ? [ n ] S \subseteq [n] S?[n] 根据某个概率分布 P P P 随机而来。 在知道了哪些猫猫愿意被撸之后,小B可以选择某一只愿意的来 rua。注意,如果 S S S 集合为空,则小 B 不能撸任何一只猫。同时,小 B 的撸猫策略可以带有随机性。比如,在知道了 1,2 号猫猫都愿意被撸之后,他可以以 50 % 50\% 50% 的概率撸第一只猫,以另外 50 % 50\% 50% 的概率撸第二只猫。

作为一位公平的人,小 B 希望给每一只猫猫更多被 rua 的机会。他希望设计一个撸猫的策略来最大化 Pr ? [ i 被撸 ∣ i ∈ S ] \operatorname{Pr}[i_{\text{被撸}} | i\in S] Pr[i被撸?iS] 的最小值。换句话说,令 p i = Pr ? [ i ∈ S ] p_i = \operatorname{Pr}[i\in S] pi?=Pr[iS] 是第 i i i 只猫猫愿意被撸的概率。我们需要设计一个撸猫的策略来最大化常数 c c c,使得每只猫被撸的概率至少是 c p i cp_i cpi?

输入格式

一行一个整数 n n n
一行 2 n 2^n 2n 个浮点数,表示第 i i i 种可能情况的概率。

输出格式

一行一个浮点数 c c c,表示答案。

样例

样例输入 1

2
0.25 0.25 0.25 0.25

样例输出 1

0.7500000000

样例输入 2

3
0.12 0.18 0.02 0.1 0.1 0.05 0.15 0.28

样例输出 2

0.5057471264

数据范围与提示

Subtask 1 [12 pts]: 1 ? n ? 2 1\leqslant n\leqslant 2 1?n?2
Subtask 2 [18 pts]: 1 ? n ? 7 1\leqslant n\leqslant 7 1?n?7
Subtask 3 [10 pts]: 1 ? n ? 10 1\leqslant n\leqslant 10 1?n?10
Subtask 4 [35 pts]: 1 ? n ? 15 1\leqslant n\leqslant 15 1?n?15
Subtask 5 [25 pts]: 1 ? n ? 20 1\leqslant n\leqslant 20 1?n?20

题解

听永神说是脑瘫题。

考虑二分答案,那么问题就转化为一个二分图网络流:左边是 2 n 2^n 2n 个点表示每种情况,入边容量为这种情况的概率,右边是 n n n 个点表示每只猫,出边容量为 c ? p i c*p_i c?pi?,中间对应连上容量 + ∞ +\infty + 的边。答案合法当且仅当图的右边满流。

我们可以直接套用 H a l l \rm Hall Hall 定理来判断是否可以满流,这样判断一次是 O ( 2 n ) O(2^n) O(2n),二分答案可以直接通过。

当然你会发现完全没必要二分答案,直接 H a l l \rm Hall Hall 定理枚举时取个最小值即可。

代码

我的还是二分答案

#include<bits/stdc++.h>//JZM yyds!!
#define ll long long
#define lll __int128
#define uns unsigned
#define fi first
#define se second
#define IF (it->fi)
#define IS (it->se)
#define END putchar('\n')
#define lowbit(x) ((x)&-(x))
#define inline jzm
using namespace std;
const int MAXN=114514;
const ll INF=1e18;
ll read(){
	ll x=0;bool f=1;char s=getchar();
	while((s<'0'||s>'9')&&s>0){if(s=='-')f^=1;s=getchar();}
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar();
	return f?x:-x;
}
int ptf[50],lpt;
void print(ll x,char c='\n'){
	if(x<0)putchar('-'),x=-x;
	ptf[lpt=1]=x%10;
	while(x>9)x/=10,ptf[++lpt]=x%10;
	while(lpt>0)putchar(ptf[lpt--]^48);
	if(c>0)putchar(c);
}
const double eps=1e-10;
int n;
double p[25],f[1<<20],g[1<<20],sum;
bool check(double c){
	for(int s=0;s<(1<<n);s++)g[s]=0;
	for(int i=1;i<=n;i++)
		for(int s=0,lim=1<<(i-1);s<lim;s++)g[s^lim]=g[s]+p[i]*c;
	for(int s=0,m=(1<<n)-1;s<=m;s++)if(g[s]>=sum-f[s^m]+eps)return 0;
	return 1;
}
int main()
{
	n=read();
	for(int s=0;s<(1<<n);s++)
		*new(int)=scanf("%lf",f+s),sum+=f[s];
	for(int s=0;s<(1<<n);s++)
		for(int i=1;i<=n;i++)if((s>>(i-1))&1)p[i]+=f[s];
	for(int k=1;k<(1<<n);k<<=1)
		for(int s=0;s<(1<<n);s++)if(s&k)f[s]+=f[s^k];
	double l=0,r=1,mid=0.5;
	for(int NND=50;NND--;){
		mid=(l+r)/2;
		if(check(mid))l=mid;
		else r=mid;
	}
	printf("%.10f\n",mid);
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:26:10  更:2022-06-01 15:27:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/22 10:01:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码