洛谷-P5541 Sleepy Cow Herding S
Sleepy Cow Sorting 的升级版,从 头牛变成 的情况
分类讨论 + 双指针
-
先把答案本就连续的特判丢掉
-
最大值
最大值就尽量把每个空位都踩一遍,模拟一下会发现,第一跳的空隙一定没办法踩到,因此考虑两边第一跳谁跳的短,就从哪边开始
- 最小值
- 考虑枚举答案所在的连续 个位置,假设枚举的这个区间外的牛,都可以跳进来,则答案为
显然可以转化成为:找到一个长度为 的连续区间,使得牛尽可能多,双指针处理即可
-
会有不满足条件 的情况,也就是在区间外的牛没办法跳进来,这种情况只有 头牛连续才会出现
-
类似于
5 8 9 10
的情况,区间在 为最优,可以让 跳到 ,留个位置给 跳到 ,总共 跳 -
类似于
6 8 9 10
的情况,区间在 为最优,直接让 跳到 即可,即唯一一个不连续的牛,距离连续的牛的距离为 的情况,只需要 跳
-
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<int>a(n);
for(int i=0; i<n; i++) cin >> a[i];
sort(a.begin(), a.end());
int cnt = 0, now = 1;
for(int i=1; i<n; i++)
{
if(a[i] == a[i - 1] + 1) now++;
else now = 1;
cnt = max(now, cnt);
}
if(cnt == n) {cout << "0\n0\n"; return 0;}
int ans = 0x3fffffff;
int l = 0, r = 0;
while(l < n)
{
while(r < n && a[r] <= a[l] + n - 1) r++;
ans = min(ans, n - (r - l));
l++;
}
if(cnt == n - 1)
{
ans = 2;
if(a[0] == a[1] - 2 || a[n - 1] == a[n - 2] + 2) ans = 1;
}
cout << ans << endl;
ans = a[n - 1] - a[0] - 1;
ans -= n - 2;
ans -= min(a[1] - a[0], a[n - 1] - a[n - 2]) - 1;
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具