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);
    }
  • 相关阅读:
    opencv-活体检测
    人脸识别
    Opencv-python基本操作
    白话深度学习与Tensorflow(二)
    Linux系统入门(一)-未完成
    编程题29 题目:求对角线元素之和
    编程题28 题目 排序
    编程题27 题目:求100之内的素数
    编程题 18兵乓球比赛
    编程题21 求阶数总和
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412246.html
Copyright © 2011-2022 走看看