
解法一:分类讨论
一定要多测试几个用例,考虑特殊情况,不要只用给定的用例。
考虑到含小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[10241024];运行时就会报”段错误“,遇到要申请大的空间时,就需要动态申请。
函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。栈的默认大小为2M或1M,开的比较小;
全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为2G,所以能够开的很大;
而malloc、new出的空间,则是开在堆(heap)**的一段不连续的空间。理论上则是硬盘大小;
博客介绍了算法题的两种解法。解法一需分类讨论,要多测试用例,考虑特殊情况,避免同时移动指针;解法二是暴力求解,以空间换时间。同时强调了数组内存分配问题,大数组应定义为全局变量,还介绍了栈、全局区和堆的内存分配特点。
1082

被折叠的 条评论
为什么被折叠?



