题意



分析

考场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. C++STL2--map

    C++STL2--map 一.心得 本质上就是数组,关联数组,map就是键到值得一个映射,并且重载了[]符号,所以可以像数组一样用. map<string,int> cnt;//前键后值, ...

  2. 封装DLL并调用

    c# DLL封装并调用   1.封装自己的dll: a.打开visual studio - 文件 - 新建 - 项目- 类库 - 名称MyTestDll: b.右键Class1.cs - 修改为 Te ...

  3. IntelliJ IDEA 进行多线程调试

      idea的断点有不同的模式,只有当Thread模式下才能调试多线程   断点设置步骤: 1.在断点上右键 2.选择Thread,然后点Done(建议选择Thread后点击make default把 ...

  4. Confluence 6 LDAP 成员结构设置

    用户组成员属性(Group Members Attribute) 这个属性字段将在载入用户组成员的时候使用.例如: member 用户成员属性(User Membership Attribute) 这 ...

  5. axios构建缓存池存储基础数据

    项目中经常出现需要多次使用的后端数据,通常的做法是通过变量缓存数据,或者通过类似vuex的东西来进行缓存,但是麻烦在于很可能需要判断一大堆的条件,或者说如果有权限控制的时候数据能否读取也是很麻烦的事情 ...

  6. Coconuts, Revisited(递推+枚举+模拟)

    Description The short story titled Coconuts, by Ben Ames Williams, appeared in the Saturday Evening ...

  7. Leetcode 22

    //这题感觉不如前两题回溯清楚,还要再看看class Solution { public: vector<string> generateParenthesis(int n) { vect ...

  8. n转m进制标准写法(必须记忆)

    #include <bits/stdc++.h> using namespace std; int main() { int n,m; cin >> n >> m; ...

  9. 使用a标签实现软件下载及下载量统计

    通常最简单的软件下载就是采用如下方式: <a id="welcomeMiddleBtn" href="${basePath}/files/client/instal ...

  10. 【转】asp.net 下的中文分词检索工具 - jieba.net

    jieba是python下的一个检索库, 有人将这个库移植到了asp.net 平台下, 完全可以替代lucene.net以及盘古分词的搭配 之所以写这个, 其实是因为昨天面试时, 被问到网站的关键字检 ...