zoukankan      html  css  js  c++  java
  • [排序][dp][二分]JZOJ 2746 选数排列

    传送门

    Description
    给出N个数,我们需要选择其中的R x C个数,,把它们填入一个R x C的矩阵(R行C列)中。
    我们先定义一个函数D(i)代表第i行中最大的数和最小的数之差。对于整个矩阵,定义F为矩阵中D(i) (1<=i<=R)的最大值。
    我们需要F的值最少,你能求出最少可能达到的F值是多少吗?

    题解

    首先,我们可以将读入n个数从小到大排序
    用二分求出可能出现的情况
    那么怎么判断是否可以呢
        判断每一行得到的d[i],也就是这行最后的减最前的
        判断这个数是否大于这次二分求出的情况
        如果每一行都不大于
        那这一个情况就是可行的
    

    代码

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,r,c,p[500050];
    bool check(int x)
    {
        int f[500050];
        for (int i=0;i<=c-1;i++) f[i]=0;
        for (int i=c;i<=n;i++)
        {
            f[i]=f[i-1];
            if (p[i]-p[i-c+1]<=x) if (f[i-c]+1>f[i]) f[i]=f[i-c]+1;
        }
        if (f[n]>=r) return true; else return false;
    }
    int main()
    {
        scanf("%d%d%d",&n,&r,&c);
        for (int i=1;i<=n;i++) scanf("%d",&p[i]);
        sort(p+1,p+n+1);
        int l=0,r=p[n]-p[1],mid;
        while (l<r)
        {
            mid=(l+r)>>1;
            if (check(mid)) r=mid;
            else l=mid+1;
        }
        printf("%d",l);
    }
  • 相关阅读:
    FZU 2150 Fire Game
    POJ 3414 Pots
    POJ 3087 Shuffle'm Up
    POJ 3126 Prime Path
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    字符数组
    HDU 1238 Substing
    欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
    Codeforces 591B Rebranding
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412246.html
Copyright © 2011-2022 走看看