TC SRM 458 DIV ,500

TC SRM 458 DIV ,500

位运算很重要啊,开始用递归数组生成状态,结果超时了,做了这道题才知道,原来位运算才是王道。
#include < iostream >
#include
< cmath >
#include
< cstdio >
#include
< string >
#include
< vector >
using   namespace  std;

int  n;
int  a[ 20 ];

bool  cheack(vector < int > x, int  T, int  a[], int  i, int  j)
{
    
if(x[i]<x[j]&&a[i]==1&&a[j]==0&&(x[j]-x[i])<=2*T)
        
return true;
    
if(x[i]>x[j]&&a[i]==0&&a[j]==1&&(x[i]-x[j])<=2*T)
        
return true;
    
return false;
}

void   get ( int  sum)
{

    
int i;
    
for(i=n-1;i>=0;i--)
    
{

        
if(sum&(1<<i))
            a[i]
=1;
        
else
            a[i]
=0;
    }

}



class  BouncingBalls
{

public:
    
double expectedBounces(vector <int> x, int T)
    
{
        n
=x.size();
        
int sum=(1<<(n))-1;
        
int i;
        
int j,k;
        
int cnt=0;
        
for(i=0;i<=sum;i++)
        
{
            
get(i);
            
for(j=0;j<=n-1;j++)
            
{

                
for(k=j+1;k<=n-1;k++)
                
{

                    
if(cheack(x,T,a,j,k))
                        cnt
++;
                }

            }

        }

        
return (double)cnt/(sum+1);


    }

}
;

你可能感兴趣的:(TC SRM 458 DIV ,500)