题意



分析

考场30分

枚举大小为k的子集的算法终于用上了。

时间复杂度

\[O\left(\binom{n}{k} \cdot \binom {k}{\frac{k}{2}} \cdot k\right)
\]

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=20;
int n,k;
double p[MAXN],t[MAXN];
int len; int next(int comb)
{
int x = comb & -comb,y = comb + x;
comb=(((comb & ~y) / x) >> 1) | y;
return comb;
} int main()
{
freopen("vote.in","r",stdin);
freopen("vote.out","w",stdout);
read(n);read(k);
for(int i=0;i<n;++i)
{
scanf("%lf",p+i);
}
double maxv=0;
for(int i=(1<<k)-1;i<(1<<n);i=next(i))
{
// cerr<<"i="<<i<<endl;
len=0;
for(int j=0;j<n;++j)
if(i&(1<<j))
t[len++]=p[j];
// cerr<<"len="<<len<<endl;
double ans=0;
for(int j=(1<<(len/2))-1;j<(1<<len);j=next(j)) // len=k
{
// cerr<<" j="<<j<<endl;
double sum=1;
for(int s=0;s<len;++s)
{
if(j&(1<<s))
{
// cerr<<" mul 1 "<<t[s]<<endl;
sum*=t[s];
}
else
{
sum*=(1.0-t[s]);
// cerr<<" mul 2 "<<(1.0-t[s])<<endl;
}
}
// cerr<<" sum="<<sum<<endl;
ans+=sum;
}
maxv=max(maxv,ans);
}
printf("%lf\n",maxv);
// fclose(stdin);
// fclose(stdout);
return 0;
}

标解

解释一下

  1. 所谓的贡献,就是把其他的看成常量,用i同学来计算的计算式。
  2. 换成前后至少有一个不劣。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=2e3+7;
int n,k;
double p[MAXN],pre[MAXN][MAXN],suf[MAXN][MAXN]; int main()
{
freopen("vote.in","r",stdin);
freopen("vote.out","w",stdout);
read(n);read(k);
for(int i=1;i<=n;++i)
scanf("%lf",p+i);
sort(p+1,p+n+1); pre[0][0]=1;
for(int i=1;i<=n;++i)
{
double p=::p[i];
for(int j=n;j>=1;--j)
pre[i][j]=p*pre[i-1][j-1]+(1-p)*pre[i-1][j];
pre[i][0]=(1-p)*pre[i-1][0];
} suf[n+1][0]=1;
for(int i=n;i>=1;--i)
{
double p=::p[i];
for(int j=n;j>=1;--j) // 从n到1保证不会被自己更新
suf[i][j]=p*suf[i+1][j-1]+(1-p)*suf[i+1][j];
suf[i][0]=(1-p)*suf[i+1][0];
} int m=k/2;
double ans=0;
for(int i=0;i<=k;++i)
{
int j=n+1-k+i; // n-x+1=k-i -> x=n+1-k+i
double sum=0;
for(int ci=0;ci<=m;++ci)
sum+=pre[i][ci]*suf[j][m-ci];
ans=max(ans,sum);
} printf("%.9f\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20181006 投票的更多相关文章

  1. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  2. easy_UI 投票列表

    首先我们考虑一下在项目投票种用到的属性(ID,投票标题,备选项目,参与人数) entity package cn.entity; public class GridNode { private Lon ...

  3. 利用django创建一个投票网站(六)

    建你的第一个 Django 项目, 第六部分 这一篇从第五部分(zh)结尾的地方继续讲起.再上一节中我们为网络投票程序编写了测试,而现在我们要为它加上样式和图片. 除了服务端生成的 HTML 以外,网 ...

  4. 利用django创建一个投票网站(五)

    创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...

  5. 利用django创建一个投票网站(四)

    创建你的第一个 Django 项目, 第四部分 这一篇从第三部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,专注于简单的表单处理并且精简我们的代码. 编写一个简单的表单 让我们更新一下在上一个 ...

  6. 利用django创建一个投票网站(三)

    创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...

  7. 利用django创建一个投票网站(二)

    创建你的第一个 Django 项目, 第二部分 这一篇从第一部分(zh)结尾的地方继续讲起.本节我们将继续写 Web 投票应用,并主要关注 Django 提供的自动生成的管理页面(admin site ...

  8. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  9. Django基础,Day5 - form表单投票详解

    投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...

随机推荐

  1. 周立功USBCAN-II 上位机开发(MFC)

    使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件.例程和API文档等材料,可以参考. 1.库函数的调用 首先,把库函数文件都放在工作目录下.库函数文件总 ...

  2. English trip -- VC(情景课)5 C It's on Main Street 在主街上

    Grammar focus 语法点: on,   在...上 next to ,   旁边,周围 aross from ,  对面 between  在...之间 in front of  在…前面 ...

  3. 012 - jstat命令查看jvm的GC情况 | jvm

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量. 命令的格式如下: jstat -<option> [-t] [-h<lines>] <vmid> [ ...

  4. Java 访问控制关键字

    public, private, protected 在控制上有什么区别和不同请参考下面的说明. 请参考下图的说明. 和下面的一个说明: │ Class │ Package │ Subclass │ ...

  5. windows下apache利用SSL来配置https

    第一步打开httpd.conf文件找到以下两个变量把注释去掉. #LoadModule ssl_module modules/mod_ssl.so (去掉前面的#号) #Include conf/ex ...

  6. hdu6398 计算几何

    不算严格的计算几何,就是各种分类 精度调好就能过,考虑三条边斜着放的所有情况即可 #include<bits/stdc++.h> #define LL long long #define ...

  7. UVA-10163 Storage Keepers (0-1背包)

    题目大意:有n个仓库,m个应聘者,每人对应一个能力值.一个人可以看多个仓库,一间仓库只能被一个人看.如果一个能力为p的人看k间仓库,那么安全系数为p/k,求出最大的最小安全系数,并且求出在此情况下所有 ...

  8. Java live template[在此处输入文章标题]

    Java -Dfile.encoding=UTF-8 提示键盘 功能 Logg private final Logger log = Logger.getLogger(this.getClass()) ...

  9. winform窗体this方式和handle(句柄)方式的区别

    我们来比较winform窗体的this方式和win32api handle方式实现窗体的最大化.默认窗体.半透明.不透明的区别 1.窗体界面设计 this方式按钮: btnMaxWindow. btn ...

  10. HTML绘制三角形的方法:

    <!DOCTYPE html> <html> <body> <style> #triangle-up { width: 0px; height: 0px ...