CCF201809-2 买菜

13 篇文章 0 订阅

其实这个题有简单的方法,用空间换时间。我试过那种方法,当时ZZ了,用的i=a;i<=b;i++,最后统计数组中值为2的数。然后长度总是会超,现在想,当时就是白痴。(正确的应该是i=a;i<b;i++。应该左闭右开)


 

不过后来换了一种方法,也可以做,即:定义一个判断是否有交叉的函数,然后进行暴力破解,若区间有相交,则进行相交区域计算(中间需要剪枝。)

 

下面贴出代码:


#include<iostream>
#include<algorithm>

using namespace std;

struct key{
	int x;
	int y;
};

bool cha(key a,key b)//交叉区域判断
{
	if (a.x>b.x)
	{
		key t;
		t=a;
		a=b;
		b=t;
	}
	if(a.y<=b.x)
	{
		return false;
	}
	else 
	{
		return true;
	}
	
}
int main()
{
	int n;
	cin>>n;
	key h[2001];
	key w[2001];
	for(int i=0;i<n;i++)
	{
		cin>>h[i].x>>h[i].y;
	}
	for(int i=0;i<n;i++)
	{
		cin>>w[i].x>>w[i].y;
	}
	int temp=0;
	int all=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(cha(h[i],w[j]))
			{
				temp=h[i].y-h[i].x+w[j].y-w[j].x-(max(h[i].y,w[j].y)-min(h[i].x,w[j].x));
				all+=temp;

			}
			if(w[j].x>h[i].y)//剪枝
			{
				break;
			}
			
		}
	}
	cout<<all;
	return 0;
	
	
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值