HDU 3432

水题,就是把一个矩形平分。

题意:一个wid*hei的矩形,过底边上的一点(dor,0)做m-1条射线,把这个矩形的面积平均分成m份,求这些射线和矩形的另外一个交点。

直接枚举,然而求三角形高底移动坐标即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
struct pointer	{
	double x,y;
}ans[120];
const double eps=0.00000001;

int main(){
	int wid,heg,door,p;
	while(scanf("%d%d%d%d",&wid,&heg,&door,&p)!=EOF){
		if(wid==0&&heg==0&&door==0&&p==0) break;
		double ye=0,xe=wid,ys=heg;
		double parea=(wid*heg)*1.0/p;
		double part1=(wid-door)*heg*1.0/2;
		double part2=wid*heg*1.0/2;
	 	double part3=(door)*heg*1.0/2;
	 	double tmp;
	 	for(int i=0;i<p;i++){
	 		tmp=parea;
	 		if(part1>eps){
	 			if(tmp-eps>part1){
	 				tmp-=part1;
	 				part1=0;
	 			}
	 			else if(fabs(tmp-part1)<=eps){
	 				ans[i].x=wid; ans[i].y=heg;
	 				part1=0;
	 				continue;
	 			}
	 			else {
	 				double yy=(tmp*2)/(wid-door);
	 				ye+=yy;
	 				ans[i].x=wid; ans[i].y=ye;
	 				part1-=tmp;
	 				continue;
	 			}
	 		}
	 		if(part2>eps){
	 			if(tmp-eps>part2){
	 				tmp-=part2;
	 				part2=0;
	 			}
	 			else if(fabs(tmp-part2)<=eps){
	 				ans[i].x=0; ans[i].y=heg;
	 				part2=0;
	 				continue;
	 			}
	 			else {
	 				double xx=(tmp*2)/heg;
	 				xe-=xx;
	 				ans[i].x=xe; ans[i].y=heg;
	 				part2-=tmp;
	 				continue;
	 			}
	 		}
	 		if(part3>eps){
	 			if(tmp-eps>part3){
	 				tmp-=part3;
	 				part2=0;
	 			}
	 			else if(fabs(tmp-part3)<=eps){
	 				ans[i].x=0; ans[i].y=0;
	 				part3-=0;
	 				continue;
	 			}
	 			else{
 					double yy=(tmp*2)/door;
	 				ys-=yy;
	 				ans[i].x=0; ans[i].y=ys;
	 				part2-=tmp;
	 				continue;
	 			}
	 		}
	 	}
	 	printf("%.3lf %.3lf",ans[0].x,ans[0].y);
	 	for(int i=1;i<p-1;i++){
	 		printf(" %.3lf %.3lf",ans[i].x,ans[i].y);
	 	}
	 	printf("\n");
	}
	return 0;
}

  

posted @ 2014-07-30 10:32  chenjunjie1994  阅读(141)  评论(0编辑  收藏  举报