zoukankan      html  css  js  c++  java
  • 【Codeforces 448D】Multiplication Table

    题目链接

    链接

    翻译

    给你一个 (n*m) 的乘法表,让你找出其中第 (k) 小的数字。(重复的话算多次)

    比如 (2*2) 的乘法表中,有 1,2,2,4(4) 个数字,则第 (3) 小的数字是 (3),第 (4) 小的数字是 (4)

    题解

    二分答案。

    如果二分的 (x) 是最后的答案,那么应该满足整个乘法表中 严格 比它小的数字的个数小于等于 (k-1)

    找到最大的,满足比它小的数字小于等于 (k-1) 的数字就可以了。

    注意输入的 (k) 可能是个 (long long) 类型的整数,别顺手打成 int 了。

    代码

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    const int N = 100;
    
    int n, m;
    LL k;
    int a[N*N+10];
    
    bool ok(LL x){
        x--;
        LL cnt = 0;
        for (int i = 1;i <= n; i++){
            cnt += min(1LL*m,x/i);
        }
        return cnt <= k-1;
    }
    
    int main(){
        cin >> n >> m >> k;
        LL l = 1,r = 1LL*25*1e10,temp=1;
        while (l <= r){
            LL mid = (l+r)/2;
            if (ok(mid)){
                l = mid + 1;
                temp = mid;
            }else{
                r = mid - 1;
            }
        }
        cout << temp << endl;
        return 0;
    }
    
  • 相关阅读:
    <c:forEach>详解
    JSP基本_JSTL
    鼠标显示效果的形状设置
    linux7.3+nginx1.1+tomcat8.5 搭建负载均衡
    安装zabbix
    Centos7 systemctl使用
    Centos7 yum安装 Lnmp以及Lamp
    Centos7 LAMP环境下安装zabbix3.0
    centos 7.0 搭建LAMP环境
    mysql 配置参数详解
  • 原文地址:https://www.cnblogs.com/AWCXV/p/14086577.html
Copyright © 2011-2022 走看看