「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)

题意

给定一矩阵M,Mij=ij,求第k大值。

分析

这个题不看题解我是想不到二分的,但是二分当然属于暴力,不爽不要玩;)
实际上,现在做题解的时候,意识到一个有意思的结论:第k大xxx往往都与二分思想有关。我们还会与分治思想再见的。
具体做法:二分第k大值p。求数组中p元素是第几大即可。

代码

#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO                  \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int, int>;
using pii = pair<int, pi>;

template<typename T>
T read()
{
    T tmp; cin>>tmp;
    return tmp;
}

int main()
{
    ll n,m,k; cin>>n>>m>>k;
    ll l=0,r=(ll)n*m+1;
    //cout<<r<<endl;
    while(r-l>1)
    {
        ll mid=l+(r-l)/2;
        ll cnt=0;
        rep(i,1,n)
        {
            cnt+=min(ll(ceil(double(mid)/i)-1),(ll)m);
        }
        if(cnt+1>k)
        {
            r=mid;
        }
        else l=mid;
    }
    cout<<(l+r)/2<<endl;
    return 0;
}
posted @ 2018-08-10 15:05  ISoLT  阅读(119)  评论(0编辑  收藏  举报