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 }

 

posted @ 2013-03-20 09:34  ihge2k  阅读(276)  评论(0编辑  收藏  举报