結果
問題 | No.309 シャイな人たち (1) |
ユーザー |
![]() |
提出日時 | 2015-12-04 20:26:13 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,408 bytes |
コンパイル時間 | 1,594 ms |
コンパイル使用メモリ | 165,940 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-14 13:14:14 |
合計ジャッジ時間 | 28,000 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 TLE * 1 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef vector<int> vi;typedef vector<ll> vl;typedef complex<double> P;typedef pair<int,int> pii;#define REP(i,n) for(ll i=0;i<n;++i)#define REPR(i,n) for(ll i=1;i<n;++i)#define FOR(i,a,b) for(ll i=a;i<b;++i)#define DEBUG(x) cout<<#x<<": "<<x<<endl#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl#define ALL(a) (a).begin(),(a).end()#define MOD (ll)(1e9+7)#define ADD(a,b) a=((a)+(b))%MOD#define FIX(a) ((a)%MOD+MOD)%MOD#define Real double#define EPS (Real)(1e-12)int main(){// INPUTint h,w;cin>>h>>w;Real p[h][w];int s[h][w];REP(i,h)REP(j,w){cin>>p[i][j];p[i][j]/=100.0;}REP(i,h)REP(j,w){cin>>s[i][j];s[i][j] = 4-s[i][j];}Real result = 0.0;vector<Real> beforeRaised(1<<w),nowRaised(1<<w);beforeRaised[0] = 1.0;REP(i,h){// if know then bit 1, else then bit 0REP(nowmask,1<<w){Real rate = 1.0;REP(j,w){if(nowmask>>j & 1 == 1) rate *= p[i][j];else rate *= (1.0-p[i][j]);}if(rate<EPS)continue;bool know[w];REP(j,w)know[j] = nowmask>>j&1==1;REP(beforemask,1<<w){if(beforeRaised[beforemask]<EPS)continue;ll raising = 0;ll active[w];REP(j,w){active[j] = s[i][j]+(int)(beforemask>>j&1==1);}REP(j,w){if( active[j]>=4 && know[j] )raising |= (1<<j);}// from front & leftREPR(j,w){if( active[j]>=3 && know[j] && raising>>(j-1)&1==1 )raising |= (1<<j);}// from front & rightREPR(_j,w){ll j = w-1-_j;if( active[j]>=3 && know[j] && raising>>(j+1)&1==1 )raising |= (1<<j);}// from front & left & rightREPR(j,w-1){if( active[j]>=2 && know[j] &&raising>>(j-1)&1==1 && raising>>(j+1)&1==1 )raising |= (1<<j);}nowRaised[raising] += rate*beforeRaised[beforemask];// DEBUG(rate * beforeRaised[beforemask]);}}REP(nowmask,1<<w){result += __builtin_popcount(nowmask) * nowRaised[nowmask];}beforeRaised = nowRaised;nowRaised = vector<Real>(1<<w,0);}cout.precision(15);cout << fixed << result << endl;return 0;}