P1496 火烧赤壁 题解

难度:⭐⭐⭐
知识点:模拟
题目链接

序言:

额,这好像是一道离散化题,但我做成了模拟

1. 入手程序

模拟模拟模拟,完事~
我怎么这么喜欢模拟呢?(小声bb)

2. 编程思路

首先,可以将题目转化一个模型
用样例举例

3
-1 1
5 11
2 9

画图表示:
QQ拼音截图20200503221453.png
如果把首尾都sort一遍,会变成:
QQ拼音截图20200503221439.png

没有影响!

所以,我们得到了一个解法:分别对起点和终点数组进行排序,加上每一条线段的长度,若与前一条线段重复减去重复部分,即可算出正确答案~

3. AC代码

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
int s[20005],e[20005];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i]>>e[i];
	}
	sort(s+1,s+1+n);
	sort(e+1,e+1+n);
	for(int i=1;i<=n;i++)
	{
		ans+=e[i]-s[i];//加上当前长度 
		if(i+1<=n)//如果不是最后一条,则有可能与前一条重复 
		{
			if(e[i]>s[i+1])//如果重复 
			{
				ans-=e[i]-s[i+1];//去掉重复 
			}
		}
	}
	cout<<ans;
	return 0;
} 

我是千文杜博,记住我呦~~

The end