POJ_1003 Hangover
問題
カードを台に積み上げていく。
台からカードがはみでた部分の長さ(A)が与えられるので、その長さのはみ出しを
つくれる最小のカード枚数を出力せよ。
カードがn枚のとき、作れるはみ出しの長さLは次の式で求められる。
L = 1/2 + 1/3 + 1/4 + ... + 1/(n+1)
解法
カードの枚数を1から順に増やしていき、はみ出しの長さをそれぞれもとめ、
初めてAをこえたときの長さを出力すればいい。
誤差が怖いのでEPSつかってる。
#include <cstdio> #include <algorithm> using namespace std; const double EPS = 0.0001; int main(){ double hangover; while(scanf("%lf", &hangover) && hangover > 0.01){ int i = 1; double oh = 0.0; for(;; i++){ oh += 1.0 / (double)(i + 1); if(hangover <= oh + EPS) break; } printf("%d card(s)\n", i); } return 0; }