zoukankan      html  css  js  c++  java
  • P5541 [USACO19FEB]Sleepy Cow Herding

    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
    %d
    ",mn,max(a[n-1]-a[1],a[n]-a[2])-n+2);
    		
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2019.10.18
    28

  • 相关阅读:
    Introspector
    jython awt demo
    java中dom解析xml
    【luogu1816】忠诚
    代码调试技巧【OI缩水版】
    【UOJ78】二分图最大匹配
    【51nod】最大子段和
    【LibreOJ109】【模板】并查集
    简单的卡常数【OI缩水版】
    QQbot
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11701030.html
Copyright © 2011-2022 走看看