2014年7月16日 星期三

uva 10666 The Eurocup is Here!

這題試著把 round 3 的情形 (每一個都看過) 和測資的範例走過一遍後,會很清楚怎麼運作,

並會把所有情形考慮到。

要得知一個 number的 optimistic classification 和 pessimistic classification,分別需要知道此

number確定輸過幾個 numbers 和確定贏過幾個 numbers。

確定輸過幾個 numbers:因為 transitivity,所以在某個 round 輸了,後面的 round 也都代表自

 己輸了。要求 optimistic classification,可以當成自己只有輸過這些 numbers,其他 numbers

都假設贏了,所以 optimistic classification 下的 rank 為確定輸的 number 數 + 1。

確定贏過幾個 numbers:總 number 數 - 確定贏了幾個 numbers。因為 transitivity,所以在某

個 round 贏了之後,自己也贏了這個之下的所有 numbers。確定贏了幾個 number 之

後,optimistic classification 下的 rank 就不會比這些 number 低,所以 rank= 總 number 數 - 

確定贏了幾個 numbers。(可用記錄數字贏到第幾 round => 此 round 下面的數字都贏:2^N -1 

個)


#include <stdio.h>
#include <stdlib.h>

int main(void){
    int win_num,win,lose,component,base,round;
    int i,amount;

    scanf("%d",&amount);
    while(amount--){
        scanf("%d %d",&round,&win_num);

        base=1;
        lose=win=0;
        for(i=0;i<round;i++,base*=2){
            component=( ( (win_num/base)%2 ) == 0 ) ? (win_num + base) : (win_num - base);

            if(lose==0){
                if(win_num > component){
                    ++lose;
                    win_num=component;
                }else{
                    ++win;
                }
            }else{
                if(win_num > component){
                    ++lose;
                    win_num=component;
                }
            }
        }
        win=pow(2,win)-1;

        printf("%d %d\n",lose+1,base-win);
    }




    return 0;
}

2 則留言: