這題試著把 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;
}
請問一下 變數base是甚麼意思
回覆刪除作者已經移除這則留言。
回覆刪除