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);
    }
  • 相关阅读:
    sql 查询重复数据 删除重复数据
    echarts 仪表板指针点击事件
    Java调用webservice 天气预报
    性能优化高手 一站通关从设计到交付的性能问题
    element-ui 添加空白表格
    Linux文件管理
    Linux第五周
    Linux第四周
    Linux第三周
    Linux第二周
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412246.html
Copyright © 2011-2022 走看看