UVa 428 Swamp County Roofs
2026/6/8 11:32:16 网站建设 项目流程

题目描述

题目要求计算每个地块上屋顶的统计数据。每个屋顶由若干个四边形(或三角形)段组成,每个段由基线长度、脊线长度、基线到脊线的垂直距离以及倾斜角度描述。需要计算:

  • 屋顶表面积(所有屋顶段的总面积)
  • 屋顶覆盖的楼层面积(屋顶表面积在水平面上的投影)
  • 被屋顶拦截的雨水百分比(即楼层面积占地块面积的比例)

最后还需要输出所有地块的汇总统计:总屋顶表面积、总覆盖楼层面积、总覆盖率百分比、平均每地块屋顶表面积、平均每地块覆盖楼层面积。

输入格式

输入包含多个地块的描述。每个地块的第一行包含地块面积(平方英尺),随后若干行包含该地块上所有屋顶段的数据。每个屋顶段由四个数字描述:基线长度、脊线长度、基线到脊线的垂直距离、倾斜角度(度数)。每个地块的描述以空行结束。最后一块地后可能没有空行,但输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

首先输出表头:

Roof Area Floor Area % Covered --------- ---------- ---------

然后每行输出一个地块的统计:屋顶表面积(右对齐999列)、覆盖楼层面积(右对齐151515列)、百分比(右对齐131313列,后跟%)。

所有地块输出后,输出一个空行,然后输出汇总统计(每行一个):

  • Total surface area of roofs后跟总屋顶表面积(右对齐121212列)
  • Total area covered by roofs后跟总覆盖楼层面积(右对齐121212列)
  • Percentage of total area covered by roofs后跟总覆盖率百分比(右对齐888列,后跟%
  • Average roof surface area per lot后跟平均每地块屋顶表面积(右对齐161616列)
  • Average floor space covered per lot后跟平均每地块覆盖楼层面积(右对齐141414列)

所有数值保留两位小数。

样例

输入

100 10 10 10 60 10 10 10 60 200 5 10.5 5 30 10 10 7.5 45

输出

Roof Area Floor Area % Covered --------- ---------- --------- 200.00 100.00 100.00% 113.75 86.59 43.30% Total surface area of roofs 313.75 Total area covered by roofs 186.59 Percentage of total area covered by roofs 62.20% Average roof surface area per lot 156.88 Average floor space covered per lot 93.30

题目分析

本题的核心是计算梯形(或三角形)屋顶段的表面积及其水平投影面积。

屋顶段面积

每个屋顶段是一个梯形(当基线和脊线长度均不为零时)或三角形(当其中一条线长度为零时)。其面积公式为:
roof=(base+ridge)×distance2 \textit{roof} = \frac{(\textit{base} + \textit{ridge}) \times \textit{distance}}{2}roof=2(base+ridge)×distance
其中distance\textit{distance}distance是基线到脊线的垂直距离(在屋顶平面上)。

投影面积

屋顶段倾斜角度为θ\thetaθ(与水平面的夹角)。由于雨水垂直下落,屋顶段在水平面上的投影面积等于屋顶表面积乘以cos⁡θ\cos \thetacosθ
floor=roof×cos⁡(θ×π180) \textit{floor} = \textit{roof} \times \cos(\theta \times \frac{\pi}{180})floor=roof×cos(θ×180π)

百分比计算

每个地块的雨水拦截百分比为:
%Covered=floor_arealot_area×100% \%\textit{Covered} = \frac{\textit{floor\_area}}{\textit{lot\_area}} \times 100\%%Covered=lot_areafloor_area×100%

汇总统计

  • 总屋顶表面积:所有地块的roof_area\textit{roof\_area}roof_area之和。
  • 总覆盖楼层面积:所有地块的floor_area\textit{floor\_area}floor_area之和。
  • 总覆盖率百分比:total_floor_areatotal_lot_area×100%\frac{\textit{total\_floor\_area}}{\textit{total\_lot\_area}} \times 100\%total_lot_areatotal_floor_area×100%
  • 平均每地块屋顶表面积:total_roof_areanumber_of_lots\frac{\textit{total\_roof\_area}}{\textit{number\_of\_lots}}number_of_lotstotal_roof_area
  • 平均每地块覆盖楼层面积:total_floor_areanumber_of_lots\frac{\textit{total\_floor\_area}}{\textit{number\_of\_lots}}number_of_lotstotal_floor_area

输入解析

输入中每个地块的屋顶段数据可能跨越多行,且每个地块以一个空行结束。需要逐行读取,直到遇到空行且已读入至少一个屋顶段(即数据个数模444111,因为第一个数是地块面积,之后每444个数为一个屋顶段)。当读入数据块为空时,表示输入结束。

复杂度分析

每个屋顶段只需常数时间计算,总数据量较小,完全可接受。

代码实现

// Swamp County Roofs// UVa ID: 428// Verdict: Accepted// Submission Date: 2016-08-04// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constdoublePI=2*acos(0);intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);doubletotal_lot_area=0,total_roof_area=0,total_floor_area=0;doublelot=0,base=0,ridge=0,distances=0,angle=0;cout<<"Roof Area Floor Area % Covered\n";cout<<"--------- ---------- ---------\n";string line,block;while(true){vector<string>datas;while(getline(cin,line)){if(line.length()==0&&datas.size()%4==1)break;istringstreamiss(line);while(iss>>block)datas.push_back(block);}if(datas.size()==0)break;doubleroof,floor,lot_area=0,roof_area=0,floor_area=0;lot_area=stod(datas.front());total_lot_area+=lot_area;lot++;for(inti=1;i<datas.size();i+=4){base=stod(datas[i]);ridge=stod(datas[i+1]);distances=stod(datas[i+2]);angle=stod(datas[i+3]);roof=(base+ridge)*distances/2;floor=roof*cos(angle/180*PI);roof_area+=roof;floor_area+=floor;total_roof_area+=roof;total_floor_area+=floor;}cout<<fixed<<setprecision(2)<<setw(9)<<right<<roof_area;cout<<setw(15)<<right<<floor_area;cout<<setw(13)<<right<<(floor_area/lot_area*100);cout<<"%\n";}cout<<'\n';cout<<"Total surface area of roofs"<<setw(12)<<right<<total_roof_area<<'\n';cout<<"Total area covered by roofs"<<setw(12)<<right<<total_floor_area<<'\n';cout<<"Percentage of total area covered by roofs"<<setw(8)<<right<<(total_floor_area/total_lot_area*100)<<"%\n";cout<<"Average roof surface area per lot"<<setw(16)<<right<<total_roof_area/lot<<'\n';cout<<"Average floor space covered per lot"<<setw(14)<<right<<total_floor_area/lot<<'\n';return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询