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. SpringBoot3集成ElasticSearch

    目录 一.简介 二.环境搭建 1.下载安装包 2.服务启动 三.工程搭建 1.工程结构 2.依赖管理 3.配置文件 四.基础用法 1.实体类 2.初始化索引 3.仓储接口 4.查询语法 五.参考源码 ...

  2. Django模板(请用Django2.0版本完成)

    1. 在learn目录下新建一个templates文件夹,里面新建一个home.html (1) 很简单的,就直接右键learn,新建文件夹,完成后,继续右键templates,创建文档,后缀名为ht ...

  3. Python隔离环境的搭建

    在nodejs中,我们可以指定扩展安装的路径,那么在python中,我们是不是也可以这么做呢? 当然可以,我们只需要安装一个扩展virtualenv或者virtual wrapper就可以实现环境的隔 ...

  4. 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天

    在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...

  5. 2018-D

    2018-D 新建数据库 test0317,目录为考试目录,并在完成建表后备份 1.建表: use [test0317]; create table [STD_INFO]( [std_id] int ...

  6. MySQL 日志管理、备份与恢复

    MySQL 日志管理.备份与恢复 ---MySQL 日志管理--- MySQL 的日志默认保存位置为 /usr/local/mysql/data vim /etc/my.cnf [mysqld] ## ...

  7. salesforce零基础学习(一百三十三)ListView的button思考

    本篇参考: salesforce零基础学习(九十五)lightning out salesforce零基础学习(一百一十)list button实现的一些有趣事情 https://help.sales ...

  8. [CF1178 F2] Long Colorful Strip

    F2 - Long Colorful Strip 很牛的题! 首先,我们可以将颜色相同的一段区间缩成一个点,那么每次加入一个新的颜色时,最多只能将其所覆盖的那个颜色所属的区间分成三部分(原本:0000 ...

  9. vue之留言板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Chromium 消息循环和线程池详解

    Chromium 中的多线程机制由 base 库提供,要理解 Chromium 中的多线程机制,首先要理解的概念就是 base::MessageLoop 和 base::TaskScheduler , ...