http://acm.hdu.edu.cn/showproblem.php?pid=5089

给出N道难度递增的题目,难度用可能做出的百分比表示,选出K道题目使得做出K-1道题目的概率最大。

选k题的情况下做出k-1的概率为所有(1-p)*p*p...的和,直接尝试转化这个式子的效果并不明显。

换个思路,假设最优解已经包含了k-1个了,现在来选取最后一个。K-1个全部做出的概率是Pall(k−1),有一道为做出的概率是Pless(k−1),现在选取的是PCk,那么做出K-1道的概率是

Pall(k−1)∗(1−P[PCk])+Pless(k−1)∗P[PCk]=

Pall(k−1)+P[PCk]∗(Pless(k−1)−Pall(k−1))

这是一个关于PCk的一次函数,如果Pless(k−1)−Pall(k−1)为正,选取最大的PCk,否则选取最小的。

那么我们每次选取的时候一定是选择剩下的最大或最小,那么说明答案一定是选取两边的概率,枚举比较一下就可以算出最大的概率了。

但是要求的是字典序最小的。左边不用管,对于右边,如果存在相同的value,应该选取index较小的。然后随便搞下就ok了。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define clr0(x) memset(x,0,sizeof(x))
#define clr1(x) memset(x,-1,sizeof(x))
#define eps 1e-9
const double pi = acos(-1.0);
typedef long long LL;
typedef unsigned long long ULL;
const int modo = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int inf = 0x3fffffff;
const LL _inf = 1e18;
const int maxn = 55,maxm = 1<<12;
int n,k;
bool vis[maxn];
double p[maxn];
int pos[maxn],s[maxn];
int main()
{
int _,_g;RD(_);
while(_--){
RD2(n,k);
clr0(vis);
for(int i = 0;i < n;++i){
RD(s[i]);
p[i] = ((double)s[i])/100.0;
}
double mx = 0;
for(int g = 0;g <= k;++g){//选择前g个和后k - g个
double _p,res = 0;
int cnt = 0;
for(int i = 0;i < g;++i)
pos[cnt++] = i;
for(int i = 1;i <= k - g;++i)
pos[cnt++] = n - i;
for(int i = 0;i < cnt;++i){
_p = 1;
for(int j = 0;j < cnt;++j){
if(j != i)
_p *= p[pos[j]];
else
_p *= (1 - p[pos[j]]);
}
res += _p;
}
if(mx - res < eps){
mx = res;
_g = g;
}
}
for(int i = 0;i < _g;++i)
vis[i] = 1;
for(int i = n - (k - _g);i < n;++i){
for(int j = i;j >= 0;--j){
if(vis[j] || s[j] > s[i])
break;
_g = j;
}
vis[_g] = 1;
}
_g = 1;
for(int i = 0;i < n;++i)
if(vis[i])
printf("%d%c",i+1," \n"[_g == k]),_g++;
}
return 0;
}

hdu 5089 使做对k-1题最大概率的选题方案的更多相关文章

  1. hdu 2114 Calculate S(n) 数论(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2114 自己对数论一窍不通啊现在,做了一道水题,贴出来吧...主要是让自己记住这个公式: 前n项和的立方 ...

  2. hdu 4706:Children's Day(模拟题,模拟输出大写字母 N)

    Children's Day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. HDU 2096 小明A+B --- 水题

    HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...

  4. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  5. hdu 5008 查找字典序第k小的子串

    Boring String Problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  6. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  7. hdu 2157 How many ways?? ——矩阵十题第八题

    Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...

  8. 【js】Leetcode每日一题-停在原地的方案数

    [js]Leetcode每日一题-停在原地的方案数 [题目描述] 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处. 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指 ...

  9. hdu 5101 n集合选2个不同集合数使和大于k

    http://acm.hdu.edu.cn/showproblem.php?pid=5101 给n个集合,选择两个来自不同集合的数,加和大于k,问有多少种选择方案. 答案=从所有数中选择的两个加和大于 ...

随机推荐

  1. Android开发之自定义Dialog简单实现

    本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的App中. 首先来看一下效果图: 首先是activity的界面 点击了上述图片 ...

  2. sql server 查询不为空的字段

    经常用,经常忘 select * from table where content is not null and datalength(content)<>0

  3. poj 2785 让和为0 暴力&二分

    题目链接:http://poj.org/problem?id=2785 大意是输入一个n行四列的矩阵,每一列取一个数,就是四个数,求有多少种着四个数相加和为0的情况 首先脑海里想到的第一思维必然是一个 ...

  4. Notification 通知传值

    通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便.便捷,一个简单的Demo实现通知的跳转传值.       输入所要发送的信息 ,同时将label的值通过button方法调用传递, ...

  5. GET与POST传递数据的长度分析

    在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST.GET - 从指定的资源请求数据,POST - 向指定的资源提交要被处理的数据.本篇文章我们就来分析一下GET与PO ...

  6. python——简单爬虫

    因为要学习python,所以看到一些网站有很多文章. 如:http://python.jobbole.com/all-posts/ 目标: 将某个网站脚本编程->python模块这个分类下所有的 ...

  7. JSON中的{}与[]的区别

    []:索引数组 {}:关联数组(js中,即对象)

  8. 增加samba用户提示Failed to add entry for user

    1.首先在Ubuntu安装好samba,具体步骤为:安装samba:sudo apt-get install samba安装smbclient:sudo apt-get install 安装smbfs ...

  9. Servlet 3.0 规范(二)注解驱动和异步请求

    Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...

  10. pytho常用模块2——random

    random模块用来生成随机数,有以下几个常用方法: import random random.random() #产生随机数[0-1) random.randint(a,b) #产生随机整数[a,b ...