hdu 5089

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <vector>
 4 #include <string.h>
 5 #define inf 1e-8
 6 using namespace std;
 7 vector<int> vec;
 8 int main()
 9 {
10     int cas,n,k,posi;
11     double pro[100];
12     bool visit[100];
13     scanf("%d",&cas);
14     while(cas--)
15     {
16         scanf("%d%d",&n,&k);
17         memset(visit,0,sizeof(visit));
18         for(int i= 1; i<=n; i++)
19         {
20             scanf("%lf",pro+i);
21             pro[i] /= 100;
22         }
23         double re = 0;
24         for(int i =0; i<=k; i++)
25         {
26             double tmp = 1.0;
27             double Re = 0;
28             vec.clear();
29             for(int j = 1; j<=i; j++)
30                 vec.push_back(j);
31             for(int j = 0 ; j<k-i; j++)
32                 vec.push_back(n-j);
33             for(int j = 0; j<vec.size(); j++)
34             {
35                 tmp = 1.0;
36                 for(int jj = 0; jj<vec.size(); jj++) // 不要用除法,防止概率为0的情况
37                     if(jj !=j)
38                         tmp *= pro[vec[jj]];
39                     else
40                         tmp *= (1-pro[vec[jj]]);
41                 Re+= tmp;
42             }
43             if(Re -re > -inf)   //精度判断
44             {
45                 re = Re;
46                 posi = i;
47             }
48         }
49 
50 
51         vec.clear();
52         for(int i = 1; i<=posi; i++)
53             visit[i] = 1;
54 
55         for(int i = n -(k-posi)+1; i<=n; i++)   //最优解的情况下保证字典序最小
56         {
57             visit[i] = 1;
58             posi = i;
59             for(int j = i -1; j >0; j--)
60             {
61                 if(visit[j])
62                     break;
63                 if(pro[j] > pro[j+1])  // 最好用整形去判断,但是用浮点也能过
64                     break;
65                 posi = j;
66             }
67             visit[i] = 0;
68             visit[posi] = 1;
69         }
70 
71 
72         for(int i= 1; i<=n; i++)    //输出格式
73             if(visit[i])
74                 vec.push_back(i);
75 
76         for(int i = 0 ; i<vec.size()-1; i++)
77             printf("%d ",vec[i]);
78 
79         printf("%d\n",vec[vec.size()-1]);
80 
81     }
82     return 0;
83 }
84 /*
85 2
86 6 4
87 0 0 0 0 0 0
88 4 2
89 1 1 1 1
90 */

 

转载于:https://www.cnblogs.com/ChenAlong/p/4069019.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值