首页 > 代码库 > HDU 3432

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;}