题目链接: 小sun的假期
一、题目描述
小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。
当某天没有安排的时候就是放假。
二、输入描述:
-
第一行两个数n,m,代表总共有n天,m个安排。
-
接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。
-
安排可能会重复。
-
n≤1e9,m≤1e5
-
1≤l,r≤n
三、输出描述:
输出一行,在这个安排表中,小sun最大的快乐值。
示例1:
- 输入
5 1
2 3 - 输出
2
四、思路
- 仔细看数据范围发现用数组不好做,显然应该对所有给定区间的大小进行排序,从小到大排序之后进行遍历。寻找最大空闲区间即可。(
有点太简单了。。)
六、Code
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define ios std::ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);
#define ll long long
const int Max = 1e5+3;
const int mod = 1e9+7;
int n, m, ans=0;
struct pot{
int x, y;
}a[Max];
bool cmp(pot t1, pot t2)
{
if(t1.x < t2.x) return true;
else if(t1.x == t2.x) return t1.y > t2.y;
else return false;
}
void solve()
{
int x=0, y=0;
sort(a, a+m, cmp);
for(int i=0; i<m; i++)
{
if(i == 0) {
ans = a[i].x-1;
x = a[i].x; y = a[i].y;
}
else if(a[i].x == x) continue;
else if(a[i].x > x) {
ans = max(ans, a[i].x-x-1);
x = a[i].x;
if(a[i].y > y) y = a[i].y;
}
}
ans = max(ans, n-y);
cout << ans << endl;
}
int main()
{
ios
cin >> n >> m;
for(int i=0; i<m; i++)
cin >> a[i].x >> a[i].y;
solve();
return 0;
}
蒟蒻一只,欢迎指正