1.问题描述:
2.解题思路:
最直观的的想法是看能不能够直接求出一个通项式,然后直接算就好了, 但是这样好水的样子,而且也不知道这个通项式能否求出且精度如何?
题目中提到输入介于0.01 和5.20之间,可以确定的是最后求出来的卡片数肯定介于1-300之间,因此可以预先求出1-300张卡片分别垒起来可以达到的overhang长度。
然后用二分搜索来做。具体的代码如下:
/*author: obalamadate: 2013.07.24email: areslipan@163.com*/#include <iostream>#include <vector>#include <iterator>using namespace std;int main(){/*preprocessing*/double table[288];for(int i = 0;i<288; ++i){if(i==0)table[i] = 1/2.0;else table[i] = table[i-1] + 1.0/(i+2);}vector<int> result;double cur;cin>> cur;while(cur-0>0.00001){int head=0;int end = 277;int mid = (head + end)/2;while(table[mid] != cur){if(table[mid] < cur){head = mid +1;}else{end = mid -1;}if(head > end) break;else mid = (head + end)/2;}int maxNum;if(table[mid] >= cur)maxNum = mid +1;elsemaxNum = mid +2;result.push_back(maxNum);cin>> cur;}vector<int>::iterator iter;for(iter = result.begin(); iter != result.end(); ++iter){cout<<*iter<<" card(s)"<<endl;}return 0;}