HDU 2177 첫 번 째 방법

ime Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1008    Accepted Submission(s): 606
Problem Description
두 무더기 의 돌 이 있 는데, 수량 이 임의로 다 를 수 있다.게임 은 두 사람 이 돌아 가면 서 돌 을 채취 하기 시작 했다.게임 규정 에 따 르 면 매번 두 가지 서로 다른 취 법 이 있 는데 하 나 는 임의의 한 무더기 에서 임의의 많은 돌 을 가 져 갈 수 있다.둘 째 는 두 더미 에서 같은 양의 돌 을 동시에 가 져 갈 수 있다.마지막 으로 돌 을 모두 가 져 온 자가 승자 다.지금 은 최초의 두 무더기 의 돌 수 를 제시 합 니 다. 만약 당신 이 먼저 취 할 차례 라면 쌍방 이 모두 가장 좋 은 전략 을 취한 다 고 가정 하고 마지막 에 당신 이 승자 인지 패자 인지 물 어보 세 요.만약 네가 이기 면, 너 는 첫 번 째 로 어떻게 자식 을 얻 니? 
 
Input
몇 줄 을 포함 하 는 지 입력 하면 몇 가지 돌의 초기 상황 을 나타 낸다. 그 중에서 한 줄 에 두 개의 부정 정수 a 와 b 를 포함 하고 두 개의 돌의 수 를 나타 낸다. a 와 b 는 모두 1, 000, 000 보다 크 지 않 고 a < = b.a = b = 0 종료.
 
Output
출력 도 몇 줄 이 있 습 니 다. 마지막 에 당신 이 패자 라면 0 입 니 다. 반대로 1 을 출력 하고 당신 을 이 긴 당신 이 첫 번 째 로 돌 을 뽑 은 후에 남 은 두 무더기 의 돌 수량 x, y, x < = y 를 출력 합 니 다.만약 에 임의의 한 무더기 에서 돌 을 가 져 가면 이 길 수 있 고 두 무더기 에서 같은 수량의 돌 을 동시에 가 져 가도 이 길 수 있다. 먼저 같은 수량의 돌 을 가 져 가 는 상황 을 수출 한다.
 
Sample Input
 
   
1 2 5 8 4 7 2 2 0 0
 

Sample Output
 
   
0 1 4 7 3 5 0 1 0 0 1 2
只会枚举 ,其它方法不是很理解
#include   
#include   
int main()  
{  
    int a,b,i,k,m,n;  
    double eqa = (1+sqrt(5.0))/2.0;  
    while( scanf("%d%d",&a,&b)!=EOF && (a||b) )  
    {  
        //  a>b ,  a,b  ,                a,b   
        if( a > b )  
        {  
            a^=b;  
            b^=a;  
            a^=b;  
        }  
        k=b-a;  
        if( int(k*eqa)==a )  printf("0
"); else { printf("1
"); for(i=1; i<=a; ++i) // { n=a-i,m=b-i; if( int(k*eqa) == n ) printf("%d %d
",n,m); } for(i=a;i>=0;--i)// { n=i,m=b; k=m-n; if( int(k*eqa) == n ) printf("%d %d
",n,m); } for(i=b; i>=0; --i) // { n=a,m=i; if( n > m ) { n^=m; m^=n; n^=m; } k=m-n; if( int(k*eqa) == n ) printf("%d %d
",n,m); } } } return 0; }

좋은 웹페이지 즐겨찾기