标签:style blog io color ar os for sp div
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 */
标签:style blog io color ar os for sp div
原文地址:http://www.cnblogs.com/ChenAlong/p/4069019.html