自我练习 - 分治算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自我练习 - 分治算法相关的知识,希望对你有一定的参考价值。

2017-08-21 19:38:32 

writer:pprp

/*
theme:第一章 - 分治算法
name:魔法石的诱惑
writer:pprp
description:给你Q(0<=Q<=10^8),问你最小的自然数N使N的阶乘在十进制下包含Q个0
input:Q
output: N
date:Monday 2017/8/21
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 500000000;

//判断n的阶乘末尾有多少个0
int judge(int n )
{
    int ans = 0;
    while( n > 0)
    {
        ans += n / 5;
        n = n / 5;
    }
    return ans;
}

void run(int Q)
{
    
    int l = 1;
    int r = maxn;
    int ans = maxn + 1;
    
    while(l <= r)
    {
          int mid = (r + l) >> 1;
          int tmp = judge(mid);
          
          if(tmp == Q) ans = min(mid,ans); 
   
          if(tmp < Q)
          {
                l = mid + 1;
          }
          else if(tmp > Q)
          {
                r = mid - 1;
          }
          else
          {
                r = mid - 1;
          }
    }
      
    if(ans != maxn + 1)
    {
          cout << ans << endl;
    }
    else
    {
          cout << "No solution" << endl;              
    }       
}


int main()
{
    for(int i = 0 ; i < 100 ; i++)
    {
          cout << "i :" << i << endl;
          
          run(i);
    }
    return 0;
}

 

以上是关于自我练习 - 分治算法的主要内容,如果未能解决你的问题,请参考以下文章

2021算法竞赛入门班第二节课递归分治二分练习题

算法练习——归并排序

算法练习--归并排序排列题

Leetcode快速入门之第三节课: 分治算法

数据结构与算法6 - 分治法(上)

排序算法练习