2015 항 저 우 신입생 대회 1003 주사위 [대형 시 뮬 레이 션]

주사위 놀이
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1197    Accepted Submission(s): 358
Problem Description
  Nias 와 Ains 는 주사 위 를 특히 좋아 하 며 상대방 보다 더 잘 노 는 줄 알 았 다.
  마침내 어느 날, 그들 은 주사위 로 우열 을 가리기 로 결정 했다!
  일반적인 주사위 게임 방법 은 그들의 수준 을 나타 내기 에 부족 하기 때문에 그들 은 스스로 게임 방법 을 만들어 PK 를 만 들 었 다.
우선 주사위 3 개 씩 던 지기;이후 주사 위 를 하나 골 라 다시 던 질 수 있다.
  크기 비교 규칙:
  같은 숫자의 주사위 세 개 를 세 개 라 고 한다.같은 숫자의 주사위 두 개 를 대 라 고 한다.숫자 가 하나 밖 에 없 는 주사위 가 산 패 가 되 었 다.세 줄 > 대 자 > 산 패.쌍방의 결과 가 모두 세 개 일 때 세 개의 숫자의 크기 를 직접 비교한다.모두 쌍 이 있 을 때 먼저 쌍 의 숫자 크기 를 비교 하고 같 으 면 나머지 주사위 의 숫자 크기 를 비교 합 니 다.모두 산 패 만 있 을 때 가장 큰 숫자의 크기 를 비교 하고 똑 같 으 면 큰 숫자의 크기 를 비교 하고 똑 같 으 며 마지막 에 가장 작은 숫자의 크기 를 비교 합 니 다.
  현재 니 아 스 는 3 개의 주사 위 를 던 졌 고, 그 중 하 나 를 선택 하여 다시 던 질 수 있 는 기회 가 한 번 남 았 으 며, 에 인 스 의 마지막 던 지기 결 과 를 알 고 니 아 스 가 이 길 확률 이 얼마나 되 는 지 알 고 있다.
 
Input
데이터 첫 번 째 행동 의 정수 T 를 입력 하면 T 조 테스트 데이터 가 있 음 을 나타 낸다.
이 어 T 행 은 행 당 1 ∼ 6 의 정 수 를 6 개 씩, 앞 세 개 는 니 아 스 의 1 차 투척 결 과 를, 뒤 세 개 는 아이 아 스 의 최종 투척 결 과 를 나타 낸다.
 
Output
Nias 가 이 길 확률 을 출력 하 십시오. 결 과 는 3 자리 소 수 를 유지 하고 각 조 의 출력 은 한 줄 을 차지 합 니 다.
 
Sample Input

   
   
   
   
4 2 3 5 3 3 4 3 3 1 2 2 2 6 2 1 5 4 3 1 2 3 4 4 1

 
Sample Output

   
   
   
   
0.333 0.167 1.000 0.000

 
번 거 로 운 모 의 문제.BUG 를 찾기 위해 서 제 가 맞 춤 법 을 배 워 서... 수확 이 라 고 할 수 있 죠.
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;

int num1[10]={0},num2[10]={0};
int size2=0;
int now[3];
bool has_won()
{
	memset(num1,0,sizeof num1);
	for(int i=0 ; i<3 ; ++i)num1[now[i]]++;
	int size1=0;//条子数, 
	for(int i=1 ; i<=6 ; ++i)
	{
		size1=max(num1[i],size1);
	}
	if(size1>size2)return 1;
	else if(size1<size2)return 0;
	else
	{
		if(size1==1 || size1==3)
		{
			for(int i=6 ; i>=0 ; --i)
			{
				if(num1[i] && num1[i]==num2[i])
				{
					if(size1==3)return 0;
					else continue;
				}
				if(num1[i])return 1;
				if(num2[i])return 0;
			}
			return 0;
		}
		else if(size1==2)
		{
			int a=0,b=0;
			for(int i=6 ; i>=0 ; --i)
			{
				if(num1[i]==2)
					a=i;
				if(num2[i]==2)
					b=i;
			}
			if(a>b)return 1;
			else if(a<b)return 0;
			else
			{
				for(int i=6 ; i>=0 ; --i)
				{
					if(num1[i]!=2 || num2[i]!=2)
					{
						if(num1[i] && num1[i]!=num2[i])return 1;
						if(num2[i])return 0;
					}
				}
			}
		}
	}
	return 1;
}
int main(void)
{
	cin.tie(0);ios::sync_with_stdio(0);
	int T;
	cin>>T;
	cout<<fixed<<setprecision(3);
	while(T--)
	{
		memset(num2,0,sizeof num2);
		size2=0;
		cin>>now[0]>>now[1]>>now[2];
		for(int i=0 ; i<3 ; ++i)
		{
			int t;
			cin>>t;
			num2[t]++;
		}
		for(int i=1 ; i<=6 ; ++i)
		{
			size2=max(num2[i],size2);
		}
		double ans=0;
		if(has_won())cout<<"1.000"<<"
"; else { int ori=now[0]; for(int k=0 ; k<3 ; ++k) { int a=0,b=0; ori=now[k]; for(int i=1 ; i<=6 ; ++i) { b++; now[k]=i; //cout<<"try:"; //for(int i=0 ; i<3 ; ++i)cout<<now[i]<<" "; //cout<<"
"; if(has_won()) { //cout<<"passed
"; a++; } } if(b!=0)ans=max((double)a/b,ans); //cout<<"nowans:"<<ans<<"
"; now[k]=ori; } cout<<ans<<"
"; } } return 0; }

좋은 웹페이지 즐겨찾기