public boolean pass(int[] bowl, int bowlId, int round,
            boolean canPick,
            boolean musTake) {
    	
    	int bowlScore = 0;
    	double expectedScore=0;
    	if(strategy == 0 || (strategy==1 && round==1)){
    		//System.out.println("Strategy: "+strategy+"\t"+"Round: "+round);
    		bowlScore = buildDistribution(bowl,bowlId,round);
			scoresSeen.add(bowlScore);
			len[round]++;
    		if(bowlsSeen[0]+bowlsSeen[1]>=x)
    		{
    			expectedScore=calcExpectedScore(bowl);
    			double multiplier=0;
    			if(round == 0)
    			{
    				multiplier = ((double)maxBowls[round]-bowlsSeen[round])/((double)maxBowls[round]-x);
    			}
    			else 
    			{
    				double denominator=0;
    				if(bowlsSeen[0]>x)
    					denominator = (double)maxBowls[round];
    				else
    					denominator = (double)maxBowls[round]-x+bowlsSeen[0];
    				multiplier = ((double)maxBowls[round]-bowlsSeen[round])/(denominator);
    			}
    			double updated_expectedScore = expectedScore+(multiplier*std_dev);
    			bowlsSeen[round]++;	
    			//System.out.println("Bowl Score: "+bowlScore);
    			//System.out.println("Expected Score: "+expectedScore);
    			//System.out.println("Multiplier: "+multiplier);
    			//System.out.println("Updated Expected Score: "+updated_expectedScore);
    			//System.out.println("Bowls Seen: "+bowlsSeen[round]);
    			return bowlScore >= updated_expectedScore;
//    			return bowlScore >= expectedScore+(multiplier*std_dev);
    		}
    		bowlsSeen[round]++;	
    		return false;
    	}
    	
    	if(strategy == 1 && round==0)
    	{
    		//System.out.println("Strategy: "+strategy+"\t"+"Round: "+round);
    		bowlsSeen[round]++;	
    		return optimal(bowl,bowlId,round);
    	}
    	
    	if(strategy == 2)
    	{
    		//System.out.println("Strategy: "+strategy+"\t"+"Round: "+round);
    		bowlsSeen[round]++;	
    		return optimal(bowl,bowlId,round);
    	}
    	
		scoresSeen.add(bowlScore);
		len[round]++;
    	//System.out.println("Never reach here..");
    	return false;
    }