zoukankan      html  css  js  c++  java
  • 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("
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    [ZOJ1610]Count the Colors
    浅谈算法——线段树之Lazy标记
    浅谈算法——线段树
    [HEOI2013]Segment
    [JSOI2008]Blue Mary开公司
    [JSOI2016]扭动的回文串
    [BZOJ3790]神奇项链
    [BZOJ2565]最长双回文串
    [BZOJ2160]拉拉队排练
    [POI2010]Antisymmetry
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3877417.html
Copyright © 2011-2022 走看看