2019牛客国庆集训派对day2 B Higher h-index(二分)

链接:https://ac.nowcoder.com/acm/contest/1107/B
来源:2019牛客国庆集训派对day2

  • 题目描述
    The h-index of an author is the largest h where he has at least h papers with citations not less than h.
    Bobo has no papers and he is going to publish some subsequently.
    If he works on a paper for x hours, the paper will get (a⋅x) citations, where a is a known constant.
    It’s clear that x should be a positive integer.
    There is also a trick – one can cite his own papers published earlier.
    Given Bobo has n working hours, find the maximum h-index of him.
  • 输入描述
    The input consists of several test cases and is terminated by end-of-file.
    Each test case contains two integers n and a.
    1 ≤ n ≤ 109
    0 ≤ a ≤ n
    The number of test cases does not exceed 104.
  • 输出描述
    For each test case, print an integer which denotes the maximum h-index.
  • 输入
    3 0
    3 1
    1000000000 1000000000
  • 输出
    1
    2
    1000000000
  • 备注
    For the first sample, Bobo can work 3 papers for 1 hour each.
    With the trick mentioned, he will get papers with citations 2, 1, 0. Thus, his h-index is 1.
    For the second sample, Bobo can work 2 papers for 1 and 2 hours respectively. He will get papers with citations 1 + 1, 2 + 0. Thus, his h-index is 2.

  题意:Bobo 印刷一些纸张,他有 n 个小时,他可以选择任意的时间段( x小时 )去印刷纸张,当前纸张的贡献是 a × x,如果当前的纸张之前有印刷好的纸张,那么当前纸张的贡献还要加上前面印刷好的纸张的数量。问最大的 h,h表示至少有 h 张纸的贡献至少为 h。
  思路:我们假设每张纸都有 1 小时的时间来印刷,直接二分 h,mid >= n - mid + a ,一共印刷了 n 张纸,其中满足条件的有 mid 张,n - mid 是前面生产好的纸张加上 a 是这些纸的最小的贡献。前面的式子如果成立说明当前的贡献(n - mid + a)满足题意,并且可以更大,否则说明纸张数量过多,减小即可。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int Max_n = 1e6 + 10;
int a, n;

bool check(int mid) {
    return mid >= n - mid + a;
}
int main() {
    while(~scanf("%d%d", &n, &a)) {
        int l = 1, r = n, ans = 0;
        while(l <= r) {
            int mid = (l + r) / 2;
            if(check(mid)) {
                ans = n - mid + a;
                r = mid - 1;
            } else l = mid + 1;
        }
        printf("%d\n", ans);
    }
    return 0;
}




/**
* Copyright(c)
* All rights reserved.
* Author : Max_n
* Date : 2019-10-02-13.16.09
* Problem : Higher h-index
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值