hdu 1725(Find minimal sum)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1725

思路:几天前看到过这道题,当时没什么想法,今天心血来潮,就想尝试一下,1Y...orz...

一开始先打个表,把13以内的阶乘都算出来,然后二分查找,二分查找的时候如果没有找到相等的,返回的位置是后一个。。。这样循环就可以了。

View Code
 1 #include<iostream>

 2 using namespace std;

 3 int facs[13]={0,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};//打表找出前12个的阶乘

 4 

 5 int Binary_Search(int low,int high,int number){

 6     while(low<=high){

 7         int mid=(low+high)/2;

 8         if(facs[mid]==number)return mid;

 9         else if(facs[mid]>number)high=mid-1;

10         else low=mid+1;

11     }

12     return low;

13 }

14 

15 int main(){

16     int n;

17     scanf("%d",&n);

18     while(n--){

19         int m,summin=0;

20         scanf("%d",&m);

21         while(m){

22             int pos=Binary_Search(0,12,m);//二分

23             //相等的话就要退出

24             if(facs[pos]==m){

25                 summin+=1;

26                 break;

27             }else {

28                 summin+=m/facs[pos-1];

29                 m%=facs[pos-1];

30             }

31         }

32         printf("%d\n",summin);

33     }

34     return 0;

35 }

 

你可能感兴趣的:(find)