ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P5541 [USACO19FEB]Sleepy Cow Herding

2019-10-18 21:53:27  阅读:374  来源: 互联网

标签:ch Cow int namespace mn Sleepy 特判 P5541 mx


ri,被黄题虐。


思路:贪心??

提交:2次

错因:没有特判

题解:

先排序。
最小代价:固定区间长度为\(n\),我们扫一遍数组看区间最多包含几个数,设为 \(mx\) ,答案就是\(n-mx+1\);然而还要特判一种,见下。

此时答案是2,但是我们会算成1
最大代价:考虑一定是往一边缩的感觉,于是是端点先跳到一边的里面,然后这一边开始往里缩,直到缩成n
所以答案是\(\max(a[n-1]-a[1]+1,a[n]-a[2]+1)-(n-1)+1\),最后的加一是刚开始端点往里跳的代价。

代码:

#include<bits/stdc++.h>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
    register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
    do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=100010;
int n,mx,mn,a[N];
inline void main() {
    mn=n=g(); for(R i=1;i<=n;++i) a[i]=g();
    sort(a+1,a+n+1); 
    if((a[n-1]-a[1]+1==n-1&&a[n]-a[n-1]+1>3)||(a[n]-a[2]+1==n-1&&a[2]-a[1]+1>3)) mn=2;
    else {
        R p=1;
        for(R i=1;i<=n;++i) {
            while(p<n&&a[p+1]-a[i]+1<=n) ++p;
            mn=min(mn,n-(p-i+1));
        }
    } printf("%d\n%d\n",mn,max(a[n-1]-a[1],a[n]-a[2])-n+2);
        
}
} signed main() {Luitaryi::main(); return 0;}

2019.10.18
28

标签:ch,Cow,int,namespace,mn,Sleepy,特判,P5541,mx
来源: https://www.cnblogs.com/Jackpei/p/11701030.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有