• poj 3685 矩阵问题 查找第K小的值


    题意:N阶矩阵Aiji2 + 100000 × i + j2 – 100000 × j + i × j,求第M小的元素。

    思路:双重二分

    1. 考虑到,aij是跟着i递增的,所以i可以作为一个二分搜索
    2. 统计比 mid小的个数 
    3. 如果个数小于 m的话 mid太小 
    4. 反之 mid太大

    解决问题的代码:

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    using namespace std;
    
    typedef long long ll;
    
    ll t, n, m;
    ll f(ll i, ll j)
    {
        return i * i + 100000 * i + j * j - 100000 * j + i * j;
    }
    bool solve(ll mid)
    {
        ll less = 0;
        for (int j = 1; j <= n; j++)
        {
            int lb = 0, ub = n + 1;
            while (ub - lb > 1)
            {
                int i = (ub + lb) / 2;
                if (f(i, j) <mid)
                {
                    lb = i;
                }
                else ub = i;
            }
            less += lb;
        }
        return less < m;
    }
    int main()
    {
        scanf("%lld", &t);
        while (t--)
        {
            scanf("%lld%lld", &n, &m);
            ll lb = -100000 * n;
            ll ub = n * n + 100000 * n + n * n + n * n;
            while (ub - lb > 1)
            {
                ll mid = (ub + lb) / 2;
                if (solve(mid)) lb = mid;
                else ub = mid;
            }
            printf("%lld
    ", lb);
        }
        return 0;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    CodeForces
    设计模式之装饰模式和代理模式区别与联系
    java反射 概念
    Java 反射详解 转载
    Spring--AOP 例子
    MD5加密
    面向对象编程思想(OOP)
    软件测试assert
    junit4.9测试用例 spring测试用例 Assert 注解
    断言
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9418905.html
Copyright © 2020-2023  润新知