CCF 201809-2 买菜 C++含数组局部全局问题

博客介绍了算法题的两种解法。解法一需分类讨论,要多测试用例,考虑特殊情况,避免同时移动指针;解法二是暴力求解,以空间换时间。同时强调了数组内存分配问题,大数组应定义为全局变量,还介绍了栈、全局区和堆的内存分配特点。

在这里插入图片描述
解法一:分类讨论
一定要多测试几个用例,考虑特殊情况,不要只用给定的用例。
考虑到含小h的一个区间包含小w的两个区间的特殊情况有的时候只能i++,有时只能j++。一定要不能同时i++、j++,那样会忽略掉一些情况。只有20分。 另外等号也要注意。
测试数据:含小h的一个区间包含小w的两个区间的特殊情况。
二刷100分代码:

#include <iostream>
struct point{
	int s,t;
};
using namespace std;
int main()
{
	int n;
	int sum=0;
	cin >> n;
	point h[n],w[n];
	for(int i=0;i<n;i++)
	{
		cin >> h[i].s >> h[i].t;
	}
	for(int i=0;i<n;i++)
	{
		cin >> w[i].s >> w[i].t;
	}
	int i=0,j=0;
	while(i<n&&j<n)
	{
		if(h[i].s>w[j].t)  j++;
		else if(h[i].t<w[j].s)  i++;
		else if(h[i].s<=w[j].s&&h[i].t<=w[j].t)
		{
			sum+=h[i].t-w[j].s;
			i++;
		}
		else if(h[i].s>=w[j].s&&h[i].t>=w[j].t)
		{
			sum+=w[j].t-h[i].s;
			j++;
		}
		else if(h[i].s<=w[j].s&&h[i].t>=w[j].t)
		{
			sum+=w[j].t-w[j].s;
			j++;
		}
		else if(h[i].s>=w[j].s&&h[i].t<=w[j].t)
		{
			sum+=h[i].t-h[i].s;
			i++;
		}
	}
	cout << sum << endl;
	return 0;
} 

测试数据:

4
1 3
5 6
9 13
14 15
2 6
7 8
10 11
13 14

解法二:暴力求解(以空间换时间 )
注意:数组过大,必须在主函数外部定义保证内存足够分配,在主函数内部定义过大的数组内存会分配不足

#include <iostream>
#include <algorithm>
const int N=1000000;
using namespace std;
int a[N]={0}; //数组过大,须在主函数外部定义保证内存足够分配,在主函数内部定义过大的数组内存会分配不足
int main()
{
	int n,b,c;	
	cin >> n;
	for(int i=0;i<2*n;i++)
	{
		cin >> b >> c;
		for(int j=b;j<c;j++)
		{
			a[j-1]++;	
		}		
	}
	cout << count(a,a+N,2) << endl; 	    
	return 0;
}

10241024=1048576 所以超过七位数的数组就不要定义局部变量了,而要全局变量。**经常在需要统计分布在各区间的点时用到。
在栈上(局部变量)或全局静态区(全局变量)上分配的,一般栈的内存是1M到2M,所以静态分配的空间不能太大,比如如果定义a[1024
1024];运行时就会报”段错误“,遇到要申请大的空间时,就需要动态申请。
函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。栈的默认大小为2M或1M,开的比较小;
全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为2G,所以能够开的很大;
malloc、new出的空间
,则是开在
堆(heap)**的一段不连续的空间。理论上则是硬盘大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值