codeforces883I 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rule

来源:互联网 发布:吴彦祖 知乎 编辑:程序博客网 时间:2024/06/03 17:25
 这题还是不错的,题目条件很容易想到是二分答案去做,大于k的集合的划分为了满足一个最小化最大值,这是一个二分的条件。问题是怎么check,在下只想出了笨办法,n的遍历再更新线段树,所以总共nlogn91og10,肯定是可以做的,但是烦。能很快想出dp的做法也是本事。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <string>#include <vector>#include <stack>#include <bitset>#include <cstdlib>#include <cmath>#include <set>#include <list>#include <deque>#include <map>#include <queue>using namespace std;typedef long long ll;#define maxn 300010int a[maxn];int dp[maxn];int k,n;int check (int mid){    int i;    int last = 0;    for (i=k;i<=n;i++){        int j = dp[i-k];        if (a[i]-a[j+1]<=mid) last=i;        dp[i]=last;    }    return dp[n]==n;}int main (){    int i;    scanf ("%d%d",&n,&k);    for(i=1;i<=n;i++){        scanf ("%d",&a[i]);    }    sort (a+1,a+1+n);    int l =-1,r = 1e9+10;    int ans;    if (k==1) ans = 0;    else {while (r-l>1){        int mid= (l+r)/2;        if (check(mid)) r=mid;        else l = mid;    }        ans = r;    }    printf("%d\n",ans);}
阅读全文
0 0
原创粉丝点击