首页 > 试题广场 >

小sun的假期

[编程题]小sun的假期
  • 热度指数:2661 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。 

当某天没有安排的时候就是放假。

输入描述:
第一行两个数n,m,代表总共有n天,m个安排。

接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。

安排可能会重复。


输出描述:
输出一行,在这个安排表中,小sun最大的快乐值。
示例1

输入

5 1
2 3

输出

2

备注:
数据范围:


遍历区间,然后记录上一个区间终点(last记录)然后相减取最大值即可
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
using ll = long  long ;
using PII = pair<ll, ll> ;
ll n, m, ans, num, l, r;
int main() {
    ans = num = 0;
    cin >> n >> m;
    vector<PII>d;
    for (int i = 0; i < m; i++) {
        cin >> l >> r;
        d.push_back({l, r});
    }
    sort(d.begin(), d.end(), [&](const PII & a, const PII & r) {
        if (a.first != r.first) return a.first < r.first;
        return a.second > r.second;
    });
    ll last = 1;
    for (int i = 0; i < m; i++) {
        if (d[i].second < last) continue;

        ans = max(d[i].first - last, ans);
        last = d[i].second;
    }
    ans=max(ans,n-last);
    cout << ans << endl;
    return 0;
}


发表于 2025-11-27 17:44:31 回复(3)
#include <iostream>
#include <vector>
#include <algorithm>

struct Schedule
{
    int l;
    int r;
};

int main()
{

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n = 0, m = 0;
    std::cin >> n >> m;
    std::vector<Schedule> schedules(m);

    for (int i = 0; i < m; ++i)
    {
        std::cin >> schedules[i].l >> schedules[i].r;
    }

    if (m == 0)
    {
        std::cout << n << '\n';
        return 0;
    }

    std::sort(schedules.begin(), schedules.end(), [](const Schedule &a, const Schedule &b) {
        if (a.l != b.l) return a.l < b.l;
        return a.r < b.r;
    });

    int ans = 0;
    int last = 0; 

    for(int i = 0; i < m; ++i)
    {
        int cur_l = schedules[i].l;
        int cur_r = schedules[i].r;

        if(cur_l > last)
        {
            int free_len = cur_l - last - 1;
            if(free_len > ans)
            {
                ans = free_len;
            }
            last = cur_r;
        }
        else
        {
            if(cur_r > last)
            {
                last = cur_r;
            }
        }
    }

    ans = std::max(ans,n - last);

    std::cout << ans << '\n';
    return 0;
}

发表于 2025-11-27 22:25:25 回复(0)
#include<bits/stdc++.h>
using namespace std;
#define int long long 
int N = 1e9 + 5;

struct Node{
    int l, r;
};

void solve(){
    int n, m;
    cin >> n >> m;
    vector<Node> res;
    res.push_back({0, 0});
    int l, r;
    for(int i = 0; i < m; ++i){
        cin >> l >> r;
        res.push_back({l, r});
    }
    res.push_back({n + 1, n + 1});
    sort(res.begin(), res.end(), [&](const Node& s1,const Node& s2) -> bool{
        if(s1.l != s2.l) return s1.l < s2.l;
        return s1.r < s2.r;
    });

    int maxx = 0;
    int cr = 0;
    for(int i = 1; i < res.size(); ++i){
        if(res[i - 1].r >= cr) cr = res[i - 1].r;
        maxx = max(maxx, res[i].l - cr - 1);
    }
    cout << maxx;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    solve();
    return 0;
}

发表于 2025-11-28 00:22:41 回复(0)

在写题目的时候发现数据样例存在些许问题,下面是我有问题的代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(n) for(int i = 0; i < n; i++)
#define ff(n) for(int i = 1; i <= n; i++)

void solve()  {
    int n, m;
    std::cin >> n >> m;
    vector<pair<int, int>> p;
    for(int i = 0; i < m ; i++) {
        int l , r; std::cin >> l >> r;
        p.push_back({l,r});
    }
    // 对p 排序
    sort(p.begin(),p.end());
    int ans = 0;
    int sum = 0, pre = 0, pos = 1;

    // for(auto &[x,y]: p) {
        // std::cout << x << " " << y << "\n";
    // }
    for(int i = 0; i < m; i++) {
        if(i == 0) {
            pre = p[i].first;
            pos = p[i].second;
            ans = max(ans, p[i].first - 1);

        }

        // 替换前值
        if(p[i].first <= pos && pos < p[i].second) {
            pos = p[i].second;
        }

        if(p[i].first > pos) {
            // 获取中间端区间的最大值
            // ans = max(ans, p[i].first - pos - 1);
            pos = p[i].second;
            pre = p[i].first;
            ans = max(ans, p[i].first - pos);
            // std::cout << pre << " " << pos << "\n";
        }

    }

    std::cout << max(ans, n - pos) << "\n";
}

signed main() {
    int _ = 1;
    for (int i = 1; i <= _ ; i++) solve();
    return 0;
}

其中 pos 是先赋值再相减少比较出最大值也就是说, 下面代码找的不是最大空闲区间, 而且最长区间段

pos = p[i].second;
pre = p[i].first;
ans = max(ans, p[i].first - pos);

下面例子可以hack掉我上面的代码

1 100

500 500

2000 3000

10000 20000

30000 50000

70000 100000

123456 789012

150000 200000

250000 300000

350000 400000

450000 500000

550000 600000

650000 700000

750000 800000

850000 900000

950000 1000000

987654 1234567

1000000 2000000

2000000 3000000

3000000 4000000

4000000 5000000

5000000 6000000

6000000 7000000

7000000 8000000

7654321 8765432

8000000 9000000

9000000 10000000

9999999 10000000

10000000 20000000

20000000 30000000

30000000 40000000

40000000 50000000

50000000 60000000

60000000 70000000

70000000 80000000

80000000 90000000

90000000 100000000

100000000 200000000

200000000 300000000

300000000 400000000

400000000 500000000

500000000 600000000

600000000 700000000

700000000 800000000

800000000 900000000

900000000 10000000

错误代码输出为 0但是实际结果是 49999。尽管如此, 我的代码任然通过全部用例 故而我觉得样例需要适当增强以确保答案正确

发表于 2025-11-27 23:15:09 回复(0)
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,m;
cin>>n>>m;
vector<pair<int,int>> q;
for(int i=0;i<m;i++){
int l,r;
cin>>l>>r;
q.push_back({l,r});
}
sort(q.begin(),q.end());
int l=1,r=1;
int ans=0;
for(int i=0;i<m;i++){
auto t = q[i];
int x=t.first;
int y = t.second;
if(x<=r) {
r=max(r,y);
}else {
ans=max(ans,x-l);
l=x,r=y;
}
}
ans=max(ans,n-r);
cout<<ans<<endl;
}

int main() {
int t=1;
while(t--){
solve();
}
return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-11-27 23:05:45 回复(0)
使用瞪眼法,注意到,题目数据较弱
只用找到最小的l和最大的r就过了
加上快读,9ms过关
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int qd() {
	int w = 1, c, ret;
	while ((c = getchar()) > '9' || c < '0')
		w = (c == '-' ? -1 : 1); ret = c - '0';
	while ((c = getchar()) >= '0' && c <= '9')
		ret = ret * 10 + c - '0';
	return ret * w;
}
int main() {
    int n = qd(), m = qd();
    int minl=0x3f3f3f3f;
    int maxr=0;
    for (int i = 1; i <= m; i++)
    {
        int l = qd(),r = qd();
        minl = min(minl,l);
        maxr = max(maxr,r);
    }
    cout << max(minl-1,n-maxr) << endl;
}


发表于 2025-11-27 21:39:33 回复(1)