POJ 1003
Hangover
Description
How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We're assuming that the cards must be perpendicular to the table.) With two cards you can make the top card overhang the bottom one by half a card length, and the bottom one overhang the table by a third of a card length, for a total maximum overhang of 1/2 + 1/3 = 5/6 card lengths. In general you can make n cards overhang by 1/2 + 1/3 + 1/4 + ... + 1/(n + 1) card lengths, where the top card overhangs the second by 1/2, the second overhangs tha third by 1/3, the third overhangs the fourth by 1/4, etc., and the bottom card overhangs the table by 1/(n + 1). This is illustrated in the figure below.
Input
Output
Sample Input
1.00 3.71 0.04 5.19 0.00
Sample Output
3 card(s) 61 card(s) 1 card(s) 273 card(s)
视频中提到要用二分法 离线计算 精度确定
个人首先不看视频解析暴力求解了一下:
c版本:
#include <stdio.h>
#include <math.h>
int main(){
double num;
scanf("%lf",&num);
while(num!=0){
int count=1;
double tNum=0;
while( (num-tNum)>0.001){
double x=1.0/(count+1);
tNum+=x;
count++;
}
printf("%d ",count-1);
printf("card(s)\n");
scanf("%lf",&num);
}
return 0;
}
使用视频解析中离线计算、二分法的算法:
#include <stdio.h>
#include <math.h>
int main(){
double len[300];
len[0] = 0;
int end1 = 1;
int start = 0;
while (len[end1 - 1]<5.2) {
len[end1] = len[end1-1] + 1.0 / (end1 + 1);
end1++;
}//离线计算
double num = 0;
scanf("%lf", &num);
while (num != 0) {
int count = 1;
start = 0;
int end = end1;
while (((len[(start + end) / 2] - num)>0.00000001|| (len[(start + end) / 2] - num)<-0.00000001) && (start + 1) != end) {//二分查找
if (num>len[(start + end) / 2]) {
start = (start + end) / 2 ;
}
else if (num<len[(start + end) / 2]) {
end = (start + end) / 2;
}
}
if ((len[(start + end) / 2] - num)>0.00000001|| (len[(start + end) / 2] - num)<-0.00000001) {
count = end;
}
else { count = (start + end) / 2; }
printf("%d ", count);
printf("card(s)\n");
scanf("%lf", &num);
}
return 0;
}
今日笔记:
abs()函数得到的结果为int类型 ,并不能用于浮点型数字的求绝对值。
c中double类型的变量,scanf要用“%lf”才能保证正确输入。