ZJU-1049-I Think I Need a Houseboat(解题来自《ACM国际大学生程序设计竞赛题解(1)》
【题目大意】
弗雷德先生正考虑在路易斯安那州买一块地造房子。在土地调查中,他了解到由于密西西比河的侵蚀,路易斯安那州正以每年50平方英里的速度变小。因为弗雷德先生谢昂在他的新房子里生活直至终老,所以他想知道他的那块地是否会被侵蚀掉。
经过进一步研究,弗雷德发现将要被侵蚀的土地呈半圆形。半圆是一个以(0,0)点位中心的圆的一半,半圆的直边是x轴。x轴以下的部分在水中。第一年开始时,圆的面积是0(半圆如题所以)。
【输入】
第一行是一个正整数N,表示有几组测试数据。
接下来N行,每行是(x,y)坐标,弗雷德正考虑的地皮位置,坐标值是以英里为单位的浮点数,坐标y不会为负数,这两个数不会都为0。
【输出】
对每组测试数据,输出一行,其格式为:
“Property N: This property will begin eroding in year Z."
其中N是测试数据编号(从1开始),经过Z年后,该处房产将位于半圆内。即经过Z年后,弗雷德的房子会被淹没。Z必须是一个整数。
在所有测试数据之后,输出”END OF OUTPUT."
【算法分析】
知道房产的位置坐标(x,y),就可以计算圆的半径r:
r*r=x*x+y*y
半圆的面积:
area=PI*r*r/2
处于侵蚀范围的年数:
year=(int)ceil(area/50.0)
其中函数ceil(double x),是得到大于x的最小整数。
【程序代码】
#include <iostream> #include <cstdio> #include <math.h> using namespace std; const double PI=3.1415927; int main() { int n,i=1; int year; double x,y,area,radius; scanf("%d",&n); while(n--) { scanf("%lf%lf",&x,&y); radius=x*x+y*y; area=PI*radius/2; year=(int)ceil(area/50.0); printf("Property %d: This property will begin eroding in year %d.\n",i++,year); } printf("END OF OUTPUT.\n"); return 0; }