zoukankan      html  css  js  c++  java
  • Floyd判圈算法 UVA 11549

    题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少?

    Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个不断重复的过程,就是说出现的数字一定有一个周期,

    这就是一个典型的循环问题。Floyd判圈算法的思想就是,例如两个小孩在一个圆形的操场上跑步,两个人以恒定的速度从同一个点出发,然后一个小孩跑步的

    速度比另一个小孩的速度要快,很显然,一定的时间后,快一点的小孩一定会追赶一个循环之后追上跑的慢的那个小孩。当两个小孩第二次相遇后,可以确定的是

    已经经过了一个周期,而且在两个周期之内。根据这个原理就可以用来判断循环了。下面附上UVA 11549 - Calculator Conundrum的解题代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<deque>
     6 using namespace std;
     7 typedef long long INT;
     8 
     9 INT cut(int n,INT k)
    10 {
    11     k *= k;
    12     deque<INT> que;
    13     while(k)
    14     {
    15         que.push_front(k % 10);
    16         k /= 10;
    17     }
    18     k = 0;
    19     for(int i = 0;i < n && !que.empty();++i)  //考虑实际长度小于n的情况 
    20     {
    21         k = 10 * k + (*que.begin());
    22         que.pop_front();
    23     }
    24     return k;
    25 }
    26 
    27 int main()
    28 {
    29     int T,n;
    30     INT k;
    31     scanf("%d",&T);
    32     while(T--)
    33     {
    34         scanf("%d%lld",&n,&k);
    35         INT K = k;
    36         INT ans = k;
    37         do
    38         {
    39             k = cut(n,k);
    40             ans = max(ans,k);
    41             K = cut(n,K);
    42             ans = max(ans,K);
    43             K = cut(n,K);
    44             ans = max(ans,K);
    45         }while(k != K);
    46         printf("%lld
    ",ans);
    47     }
    48     return 0;
    
    49 }
    View Code

    (唉,三个月没写博客了)

  • 相关阅读:
    网络流24题
    Songwriter CF1252-E(贪心)
    Card Collector AtCoder
    Game on a Tree Gym
    图书管理系统五
    bfs+状态压缩dp
    最短路径(邻接矩阵)
    求小于等于k长度的最大区间和
    链表实现队列C语言写法
    图书管理系统四
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3528920.html
Copyright © 2011-2022 走看看