zoukankan      html  css  js  c++  java
  • HUST 1588 辗转数对

    1588 - 辗转数对

    时间限制:1秒 内存限制:128兆

    155 次提交 27 次通过
    题目描述
    假设当前有一个数对(a, b),我们可以通过一步将这个数对变为一个新数对(a + b, b)或者是(a, a + b)。
    初始的数对为(1, 1),你的任务是找到一个数字k,即通过最少的步数使得这个数对中至少一个数字等于n。
    输入
    输入包括多组数据,每组数据包括一行,每行有一个整数n。
    输出
    每组数据输出一行,每行一个整数n。
    样例输入
    5
    3
    
    样例输出
    3
    2
    提示
    第一个样例的方法是 (1,1)  →  (1,2)  →  (3,2)  →  (5,2),共3步。
    题目链接:http://acm.hust.edu.cn/problem/show/1588
    分析:官网给出的输出数据又是错的!正解应该如下所示,此题一直没想出怎么解,涉及到互质的问题,对于任意步骤得到的(a,b),其中a和b肯定是互质的(gcd==1)。然后想到gcd(x,y)过程中的x,y就是要保证互质一直处理下去的,那么我们此时可以O(n)枚举答案:(i,n)(当然要保证gcd(i,n)==1);再然后模拟一波减法操作。过程维护本次减法操作的总数,过程维护最小值即可。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int gcd(int x,int y)
     4 {
     5     if(y==0)return x;
     6     else return gcd(y,x%y);
     7 }
     8 int solve(int x,int y)
     9 {
    10     if(x==1)return y-1;
    11     if(y==1) return x-1;
    12     return (x-x%y)/y+solve(y,x%y);
    13 }
    14 int main()
    15 {
    16     int n,i,output;
    17     while(cin>>n)
    18     {
    19         output=0x3f3f3f3f;
    20         for(i=1;i<=n;i++)
    21         {
    22             if(gcd(i,n)==1)
    23                 output=min(solve(i,n),output);
    24         }
    25         cout<<output<<endl;
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    hdu 2586 How far away ?
    zoj 3195 Design the city
    hust 1022 K-diff subsequence
    poj 2253 Frogger
    poj 1470 Closest Common Ancestors
    poj 2553 The Bottom of a Graph
    poj 1236 Network of Schools
    poj 3694 Network
    uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
    2014年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/6390125.html
Copyright © 2011-2022 走看看