从原点不断向外扩展,直到所有区域均满。 1.找出最先满的区域 2.更新剩余容量 3.跟新速度 跳转到1 一个地方把b写作了a, WA了n久,找了大半天,以后要注意。i,j.a,b容易搞错掉。 #include<stdio.h> #define EPS 1e-9 #define MAX 0x7fffffff typedef struct{ int x1,y1,x2,y2; int len; /* 当前根输出水的区域所接触的边的长度*/ double volumn; int overfollow; }Rect; Rect rect[101]; int n,p; double v[101],min_time,length,s; /*计算长方形周长*/ int cal_length(int x) { return (rect[x].x2-rect[x].x1 + rect[x].y2-rect[x].y1)<<1; } int Min(int a,int b) { return (a<b) ? a:b; } int Max(int a,int b) { return (a>b) ? a:b; } /*获取两个区域的重合边长度*/ int getIncet(int a,int b) { if(rect[a].x2<rect[b].x1 || rect[a].x1>rect[b].x2) return 0; if(rect[a].y2<rect[b].y1 || rect[a].y1>rect[b].y2) /*这里原来错了第一个写成了rect[a].y2<rect[a].y1*/ return 0; /*上或下*/ if(rect[a].y1 == rect[b].y2 || rect[a].y2 == rect[b].y1) return Min(rect[a].x2,rect[b].x2)-Max(rect[a].x1,rect[b].x1); /*左或右*/ if(rect[a].x1 == rect[b].x2 || rect[a].x2 == rect[b].x1) return Min(rect[a].y2,rect[b].y2)-Max(rect[a].y1,rect[b].y1); return 0; } /*x点注满水后连接其周围的区域*/ int relax(int x) { int i,len,min_index; double tmp_time; rect[x].volumn = 0.0; rect[x].overfollow=1; length += cal_length(x)-2*(rect[x].len); min_time=MAX; min_index = -1; for(i=0;i<n;i++) { if(!rect[i].overfollow) { len = getIncet(x,i); rect[i].len+=len; v[i] = (s*rect[i].len)/length; if(v[i]<EPS) continue; tmp_time = rect[i].volumn/v[i]; if( min_time-tmp_time> EPS) { min_time = tmp_time; min_index = i; } } } return min_index; } /*跟新剩余容量*/ void update_volumn() { int i; for(i=0;i<n;i++) if(!rect[i].overfollow && v[i]>EPS) rect[i].volumn -= v[i]*min_time; } int main() { int i,tmp,x,y; double time,deep; while(scanf("%d%d%d%d%lf",&n,&x,&y,&p,&s)!=EOF) { for(i=0;i<n;i++) { scanf("%d%d%d%d%lf",&rect[i].x1,&rect[i].y1,&rect[i].x2,&rect[i].y2,&deep); /*转化成分米*/ rect[i].x1 *=10; rect[i].x2 *=10; rect[i].y1 *=10; rect[i].y2 *=10; deep/=10.0; rect[i].len=0; v[i] = 0.0; rect[i].volumn = deep*(rect[i].x2-rect[i].x1)*(rect[i].y2-rect[i].y1); rect[i].overfollow=0; } tmp = p-1; time=0.0; min_time = rect[tmp].volumn/s; length = 0.0; while(tmp!=-1) { update_volumn(); time += min_time; tmp = relax(tmp); } printf("%.8lf/n",time); } return 0; }