UVA 679 Dropping Balls 【模擬+數學規律】

題目鏈接:

https://cn.vjudge.net/problem/UVA-679

題目大意:

有一個滿二叉樹,有深度d。除葉節點外每一節點有一開關,默認爲關。
有I個小球從根節點向下走,如果開關是關着的,就向左子樹走,否則向右子樹走。每走過一個節點,該節點的開關狀態轉變爲相反的狀態。現在問第I個小球最後落在編號爲多少的葉節點上。(編號爲層序編號)

大致思路

一開始覺得這個題是存在O(1)的解的,就是存在規律可以直接推出答案。但覺得太麻煩就還是用模擬去敲。然後發現純模擬的話是會超時的,所以還是要推規律,不過也不用推成O(1)的那種。
可以發現:當I爲奇數時,其走的路線和(I+1)/2的路線一樣,否則就是和I/2的路線一樣。這樣就這一直接模擬最後一次的情況。

代碼:

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
    int t,d,num;
    cin>>t;
    while(t--)
    {
        cin>>d>>num;
        if(d==-1)//題目描述的輸入很迷,反正加上就是了
            break;
        int n=(1<<d)-1,place=1;
        for(int i=1;i<=d-1;++i){
            if(num%2){
                place*=2;
                num=(num+1)/2;
            }else{
                place=place*2+1;
                num/=2;
            }
        }
        cout<<place<<endl;
    }
    return 0;
}
發佈了113 篇原創文章 · 獲贊 27 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章