求三角形面积和

题目描述

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

 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值