zoukankan      html  css  js  c++  java
  • 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest I. Photo Processing 二分+ dp,好题

    I. Photo Processing

    题意: 长度为 n 的 a[] 序列,要你划分成多个连续的部分,每一部分至少有 k 个数。对于每一部分,其权值为最大值减最小值。最后总的权值为每一部分权值的最大值,求出可能的最小的总权值。

    tags: 二分是肯定的,但没想到 dp 去 check 。。

    先对 a[] 排序,二分 mid 时,dp[i] 记录前 i 个位置中最后一个满足条件的位置。也就是说 dp[i] 要存储一个位置j,满足j<=i, 且 [1,j] 这个子区间得到的答案不超过mid。

    转移即:

    dp[i] = dp[i-1];
    if(i-k>=0 && a[i]-a[dp[i-k]+1]<=x)    dp[i] = i;

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a; i<=b; ++i)
    #define per(i,b,a) for (int i=b; i>=a; --i)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 300005;
    
    int n, k, a[N], dp[N];
    bool check(int x)
    {
        dp[0]=0;
        rep(i,1,n)
        {
            dp[i] = dp[i-1];
            if(i-k>=0 && a[i]-a[dp[i-k]+1]<=x)
                dp[i] = i;
        }
        return dp[n] == n;
    }
    int main()
    {
        scanf("%d%d", &n, &k);
        rep(i,1,n) scanf("%d", &a[i]);
        sort(a+1, a+1+n);
        int l=0, r=1e9, mid, ans;
        while(l<=r)
        {
            mid = l+r>>1;
            if(check(mid)) ans=mid, r=mid-1;
            else  l=mid+1;
        }
        printf("%d
    ", ans);
    
        return 0;
    }
  • 相关阅读:
    Logstash使用mongodb插件报错: ArgumentError: wrong number of arguments (given 2, expected 1)
    Vim注释行的方法
    设计模式之单例模式
    ssh命令的常用使用场景
    Flask 和Django
    Git 常用命令大全
    实例 静态 类
    python的各种推导式(列表推导式、字典推导式、集合推导式)
    MongoDB
    MySql变量说明
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7875467.html
Copyright © 2011-2022 走看看