poj2499

来源:互联网 发布:java url decode函数 编辑:程序博客网 时间:2024/05/21 06:41

简单的方法找规律就可以了。

Binary Tree

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 4   Accepted Submission(s) : 3
Problem Description
Background
Binary trees are a common data structure in computer science. In this problem we will look at an infinite binary tree where the nodes contain a pair of integers. The tree is constructed like this:
  • The root contains the pair (1, 1).
  • If a node contains (a, b) then its left child contains (a + b, b) and its right child (a, a + b)

Problem
Given the contents (a, b) of some node of the binary tree described above, suppose you are walking from the root of the tree to the given node along the shortest possible path. Can you find out how often you have to go to a left child and how often to a right child?
 

Input
The first line contains the number of scenarios.
Every scenario consists of a single line containing two integers i and j (1 <= i, j <= 2*109) that represent
a node (i, j). You can assume that this is a valid node in the binary tree described above.
 

Output
The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing two numbers l and r separated by a single space, where l is how often you have to go left and r is how often you have to go right when traversing the tree from the root to the node given in the input. Print an empty line after every scenario.
 

Sample Input
342 13 417 73
 

Sample Output
Scenario #1:41 0Scenario #2:2 1Scenario #3:4 6从题目的意思很明确的以最短的路径走完,所以很简单的,每次走的数字越大,所走的次数就应越少,所走的路径就越小,所以可以从最终的结果出发,向前推,便可以找到最优的次数每次都保证走最大数字,就可以。需要注意的是如果单纯的只做减法运算肯定超时,(数据量是2*109),所以要进行一点点的优化代码如下:
#include <iostream>#include <cstdio>using namespace std;int main(){    int n,k=0;    int l,r,li,ri,ra,la;    scanf("%d",&n);    while(n--)    {        li=ri=0;        k++;        scanf("%d %d",&l,&r);        while(r!=l)        {            if(r==l&&r==1)                break;            if(r>l)            {                ra=(r-1)/l;//优化减法,一次除法操作避免反复的减法,                r=r-l*ra;                ri+=ra;            }            else                if(l>r)            {                la=(l-1)/r;                l=l-r*la;                li+=la;            }        }        printf("Scenario #%d:\n%d %d\n\n",k,li,ri);    }    return 0;}


0 0
原创粉丝点击