题目描述
给出N个等腰直角三角形的斜边所对角的坐标,其斜边在坐标轴X上。求所有三角形的面积和(要求覆盖部分只求一次)。
角的坐标为整数(X,Y>0)。
输入第一行为整数N,接下来N行为三角形的顶点坐标,输出面积保留2位小数。
样例
输入
3
7 3
4 4
11 5
输出
42.00
解题思路 共3种情况
1三角形完全覆盖
2三角形部分覆盖
3不覆盖
1:将所有三角行的左下角的坐标进行比较,将其三角行按左下角坐标最小进行排序。
2:依次进行判断就算
代码如下
1:结构体解答
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
#define N 10000000
struct tank
{
int x,y,l,r; //x,y为坐标,l,r是三角形在X轴坐标
};
bool cmp(tank c,tank d)
{
return c.l<d.l;
}
tank a[N];
int main()
{
int n;
double sum=0;
cin>>n;
for(int i=1;i<=n;i++) //不覆盖
{
cin>>a[i].x>>a[i].y;
a[i].l=a[i].x-a[i].y;
a[i].r=a[i].x+a[i].y;
sum+=a[i].y*a[i].y;
}
sort(a+1,a+n+1,cmp); //升序排列
for(int i=1;i<n;i++)
{
if(a[i].r>a[i+1].l) //有覆盖情况
{
if(a[i].r>a[i+1].r) //全覆盖
{
sum-=a[i+1].y*a[i+1].y;
}
else //半覆盖
sum-=(a[i].r-a[i+1].l)*(a[i].r-a[i+1].l)/4.0;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<endl;
}
2:非结构体解答
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#define num 210
using namespace std;
int main()
{
int N;
cin>>N;
int X[num],Y[num];
float sum=0;
for(int i=1;i<=N;i++) //为了便于理解,数组下标从1开始
{
cin>>X[i]>>Y[i];
}
for(int i=1;i<=N;i++) //不覆盖
{
sum+=Y[i]*Y[i];
}
//cout<<sum<<endl;
int t;
for(int i=1;i<N;i++)//使X[1]-Y[1]<=X[2]-Y[2]<=X[3]-Y[3].....
{
if((X[i]-Y[i])>(X[i+1]-Y[i+1]))
{
t=X[i];
X[i]=X[i+1];
X[i+1]=t;
t=Y[i];
Y[i]=Y[i+1];
Y[i+1]=t;
}
}
/*
for(int i=1;i<=N;i++)
{
cout<<X[i]<<endl;
}
*/
for(int i=1;i<N;i++)
{
if(((X[i+1]-Y[i+1])<(X[i]+Y[i]))&&((X[i+1]+Y[i+1])>(X[i]+Y[i]))) //半覆盖
//后一个三角形不完全在前一个三角形内
{
sum-=((((X[i]+Y[i])-(X[i+1]-Y[i+1])))*((X[i]+Y[i])-(X[i+1]-Y[i+1]))/2)/2;
}
else if(((X[i+1]-Y[i+1])<(X[i]+Y[i]))&&((X[i+1]+Y[i+1])<=(X[i]+Y[i]))) //全覆盖
//后一个三角形完全在前一个三角形内
{
sum-=Y[i+1]*Y[i+1];
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<endl;
return 0;
}