小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。
当某天没有安排的时候就是放假。
第一行两个数n,m,代表总共有n天,m个安排。
接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。
安排可能会重复。
输出一行,在这个安排表中,小sun最大的快乐值。
5 1 2 3
2
数据范围:
#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;
} #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;
} #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;
} 在写题目的时候发现数据样例存在些许问题,下面是我有问题的代码
#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。尽管如此, 我的代码任然通过全部用例 故而我觉得样例需要适当增强以确保答案正确
#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;
}