#include <bits/stdc++.h>
#define ll long long
#define llu long long unsigned
#define ld long double
#define fr(i,n) for(int i=0;i<n;i++)
#define watch(x) cout<<(#x)<<"=="<<(x)<<endl
#define ft first
#define sc second
#define mp make_pair
#define pb push_back
#define vi vector<int>
#define pii pair<int,int>
#define P 1000000007llu
#define N 5005
#define LC 262144
using namespace std;
int n,T;
double p[N], E[N], f[N][N];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>T;
fr(i,n) {
cin>>p[i];
E[i]=2.0*p[i]-1.0, f[n][i]=0.0, f[i][0]=1.0;
// watch(p[i]); watch(E[i]); watch(n); watch(i); watch(f[n][i]); watch(f[i][0]);
}
f[n][0]=1.0;
sort(E,E+n); sort(p,p+n);
int it=(int)(lower_bound(E,E+n,0.5)-E);
if(n-it<T) it=n-T;
/* fr(i,n) watch(E[i]);
watch(it);*/
for(int i=n-1;i>=it;i--) for(int t=1;t<=T;t++) {
f[i][t]=p[i]*f[i+1][t-1]+(1.0-p[i])*f[i+1][t];
//watch(i); watch(t); watch(f[i][t]); watch(f[i+1][t-1]); watch(f[i+1][t]);
}
if(f[it][T]<=1e-6) cout<<"0\n";
else cout<<f[it][T]<<'\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <bits/stdc++.h> #define ll long long #define llu long long unsigned #define ld long double #define fr(i,n) for(int i=0;i<n;i++) #define watch(x) cout<<(#x)<<"=="<<(x)<<endl #define ft first #define sc second #define mp make_pair #define pb push_back #define vi vector<int> #define pii pair<int,int> #define P 1000000007llu #define N 5005 #define LC 262144 using namespace std; int n,T; double p[N], E[N], f[N][N]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>T; fr(i,n) { cin>>p[i]; E[i]=2.0*p[i]-1.0, f[n][i]=0.0, f[i][0]=1.0; // watch(p[i]); watch(E[i]); watch(n); watch(i); watch(f[n][i]); watch(f[i][0]); } f[n][0]=1.0; sort(E,E+n); sort(p,p+n); int it=(int)(lower_bound(E,E+n,0.5)-E); if(n-it<T) it=n-T; /* fr(i,n) watch(E[i]); watch(it);*/ for(int i=n-1;i>=it;i--) for(int t=1;t<=T;t++) { f[i][t]=p[i]*f[i+1][t-1]+(1.0-p[i])*f[i+1][t]; //watch(i); watch(t); watch(f[i][t]); watch(f[i+1][t-1]); watch(f[i+1][t]); } if(f[it][T]<=1e-6) cout<<"0\n"; else cout<<f[it][T]<<'\n'; return 0; } |
English