Problem Statement

There are $N$ cards numbered $1$ through $N$.
Each face of a card has an integer written on it; card $i$ has $A_i$ on its front and $B_i$ on its back.
Initially, all cards are face up.

There are $M$ machines numbered $1$ through $M$.
Machine $j$ has two (not necessarily distinct) integers $X_j$ and $Y_j$ between $1$ and $N$. If you power up machine $j$,
it flips card $X_j$ with the probability of $\frac{1}{2}$, and flips card $Y_j$ with the remaining probability of $\frac{1}{2}$.
This probability is independent for each power-up.

Snuke will perform the following procedure.

  1. Choose a set $S$ consisting of integers from $1$ through $M$.
  2. For each element in $S$ in ascending order, power up the machine with that number.

Among Snuke's possible choices of $S$, find the maximum expected value of the sum of the integers written on the face-up sides of the cards after the procedure.

Constraints

  • $1\leq N \leq 40$
  • $1\leq M \leq 10^5$
  • $1\leq A_i,B_i \leq 10^4$
  • $1\leq X_j,Y_j \leq N$
  • All input values are integers.

\(N\le 40\),结合题目,复杂度应该是 \(2^{\frac n2}\) 相关的。

考虑如何求出期望。如果某一个数可能被选的话,那么他的期望就是 \(\frac {A_i+B_i}2\),否则是 \(A_i\)

看样例发现要特判 \(X_i=Y_i\),如果 \(A_{X_i}<B_{X_i}\),那么交换 \(A_{X_i}\) 和 \(B_{X_i}\)

如果 \(A_i<B_i\),那么他被选后期望会减少,否则期望会增多。设有 \(c\) 个 \(i\) 会变少。

如果 \(X_i\) 和 \(Y_i\) 翻转后期望都会变少,肯定不翻。期望都会变多,肯定,肯定翻。现在就是要看 \(X_i\) 和 \(Y_i\) 期望一个会变多,一个会变少的要不要翻。

肯定要对 \(c\) 大小分治。如果 \(c\le 20\),那么选了集合 \(s\) 中的所有会减少数,肯定会选所有可以选的会变多的数,直接枚举 \(s\) 统计即可。

如果 \(c\ge 20\),那么期望会增多的 \(i\) 不超过 20 个,用一个 dp 求出要得到集合 \(s\) 至少选多少减少的。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M=45,N=1e5+5,S=1e7+5;;
int n,m,a[M],b[M],x[N],y[N],c,d,p[M],q[M],v[M][M];
LL to[S],s,f[M],ans;
LL calc(LL x,LL s)
{
int ret=0;
for(int i=0;i<d;i++)
{
if(x>>i&1)
ret+=a[q[i]]+b[q[i]];
else
ret+=2*a[q[i]];
}
for(int i=0;i<c;i++)
{
if(s>>i&1)
ret+=a[p[i]]+b[p[i]];
else
ret+=2*a[p[i]];
}
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",a+i,b+i);
for(int i=0;i<m;i++)
{
scanf("%d%d",x+i,y+i);
--x[i],--y[i];
if(x[i]==y[i])
{
if(a[x[i]]<b[x[i]])
swap(a[x[i]],b[x[i]]);
--i,--m;
}
else
v[x[i]][y[i]]=v[y[i]][x[i]]=1;
}
for(int i=0;i<n;i++)
a[i]<b[i]? p[c++]=i:q[d++]=i;
LL s=0;
for(int i=0;i<c;i++)
for(int j=i+1;j<c;j++)
if(v[p[i]][p[j]])
s|=1LL<<j|1LL<<i;
for(int i=0;i<d;i++)
{
f[i]=s;
for(int j=0;j<c;j++)
if(v[q[i]][p[j]])
f[i]|=1LL<<j;
}
if(d<=c)
{
for(int i=0;i<d;i++)
to[1<<i]=f[i];
ans=calc(0,s);
for(int i=1;i<(1<<d);i++)
{
to[i]=to[i^(i&-i)]|to[i&-i];
ans=max(ans,calc(i,to[i]));
}
}
else
{
memset(to,-0x7f,sizeof(to));
for(int i=0;i<(1<<c);i++)
if((i|s)==s)
to[i]=0;
ans=calc(0,s);
for(int i=1;i<(1<<c);i++)
{
if(!to[i])
continue;
for(int j=0;j<d;j++)
to[i]=max(to[i],to[i^(i&f[j])]+b[q[j]]-a[q[j]]);
ans=max(ans,calc(0,i)+to[i]);
}
}
printf("%.6lf",ans/2.000);
return 0;
}

[ABC313F] Flip Machines的更多相关文章

  1. Teaching Machines to Understand Us 让机器理解我们 之三 自然语言学习及深度学习的信仰

    Language learning 自然语言学习 Facebook’s New York office is a three-minute stroll up Broadway from LeCun’ ...

  2. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  3. [LeetCode] Flip Game 翻转游戏之二

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  4. [LeetCode] Flip Game 翻转游戏

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  5. poj Flip Game 1753 (枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27005   Accepted: 11694 Descr ...

  6. ARM概论(Advanced RISC Machines)

    简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...

  7. POJ1753 Flip Game(bfs、枚举)

    链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...

  8. Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记

    前言 论文“Deep Boltzmann Machines”是Geoffrey Hinton和他的大牛学生Ruslan Salakhutdinov在论文“Reducing the Dimensiona ...

  9. poj1753 Flip Game

    题意:4*4的正方形,每个格子有黑白两面,翻转格子使得4*4个格子显示全黑或全白,翻转要求:选中的那个格子,以及其上下左右相邻的格子(如果存在)要同时翻转.输出最小的达到要求的翻转次数或者Imposs ...

  10. java.nio.ByteBuffer中flip,rewind,clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

随机推荐

  1. ORM查询一个表中有两个字段相同时,只获取某个值最大的一条

    Table表如下: 获取表中name和hex值相同时age最大的那一条 ORM写法,两次查询 ids = table.values('name', 'age').annotate(id=Max('id ...

  2. 为何 Linus 一个人就能写出这么强的系统,中国却做不出来?

    前言 知乎上有一个提问:为何 Linus 一个人就能写出这么强的系统,中国却做不出来? ↓↓↓ 今天,我们就这个话题,一起来做个讨论. 不知道大家是怎么看这个问题的?是美国人更聪明吗,所以才能写出这么 ...

  3. 树状数组复习 leetcode 307

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  4. 使用“文心一言”编写技术博文《搭建企业知识库:基于 Wiki.js 的实践指南》

    百度于8月31日零点宣布,文心一言率先向全社会全面开放.我也是立即体验了下,感觉还不错.下面分享一下,如何使用"文心一言"写一篇技术博客. Step 01 生成文案主体 可以对文心 ...

  5. 【项目源码】基于JSP动漫论坛的设计与实现

    动漫论坛项目主要用于实现动漫爱好者的互相交流,基本功能包括:注册用户.登录.浏览帖子.发布新帖.回复帖子.等.本系统结构如下: (1)普通用户: 注册用户:如果用户为非会员用户,通过注册,经审核通过之 ...

  6. 【SpringBoot实战】开发入门--快速创建springboot程序

    前言 本片博客记录快速创建springboot工程的使用spring initializr创建.开发环境JDK1.8.IDEA.maven. SpringBoot 优点 可快速构建spring应用 直 ...

  7. 【Flutter】如何优美地实现一个悬浮NavigationBar

    [Flutter]如何优美地实现一个悬浮NavigationBar 最近写代码的时候遇到了一个如下的需求: 整体来说,底部的条是一个浮动的悬浮窗,有如下的三个按钮: 点击左边的要进入"主页& ...

  8. Arduino 麦克风声音传感器指南

    麦克风声音传感器 麦克风声音传感器,顾名思义,检测声音.它可以测量声音的响度. 这些传感器的种类繁多.  在下图中,您可以看到 Arduino 最常用的. 最左边是KY-038,右边是LM393麦克风 ...

  9. 教育法学第六章单元测试MOOC

    第六章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) "学习 ...

  10. 数据结构与算法 | 二叉树(Binary Tree)

    二叉树(Binary Tree) 二叉树(Binary Tree)是一种树形数据结构,由节点构成,每个节点最多有两个子节点:一个左子节点和一个右子节点. public class TreeNode { ...