题解 | [CQOI2010]扑克牌

[CQOI2010]扑克牌

https://www.nowcoder.com/practice/b77ff162bbab446993913fd684489cde

import java.io.*;
import java.util.*;

public class Main {
    
    public static void main(String[] args) throws IOException {

        // 使用BufferedReader读取输入,使用PrintWriter输出结果
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        // 读取第一行输入,分割为字符串数组
        String[] strA = br.readLine().trim().split("\\s+");

        int n = Integer.parseInt(strA[0]);
        long m = Long.parseLong(strA[1]);       

        int[] c = new int[n];                   // 创建大小为n的整型数组

        // 读取第二行输入,分割为字符串数组
        String[] strB = br.readLine().trim().split("\\s+");

        // 将字符串数组转换为整型数组
        for(int i=0;i<n;i++){
            c[i]=Integer.parseInt(strB[i]);
        }



        // 初始化二分查找的边界和结果变量
        long low = 0,high = 10000000000L;      // 设置查找范围为0到100亿
        long ans = 0;

        // 执行二分查找
        while(low<=high){
            long mid = low +((high-low)>>1);   // 计算中间值,使用位运算优化

            // 检查中间值是否满足条件
            if(check(mid,n,m,c)){
                ans = mid;                     // 如果满足条件,更新答案
                low = mid+1;                   // 尝试更大的值
            }else{
                high = mid-1;                  // 如果不满足,尝试更小的值
            }
        }

        // 输出最终结果
        out.println(ans);

        // 刷新输出流
        out.flush();
        // 关闭输出流
        out.close();
        // 关闭输入流
        br.close();
    }

    private static boolean check(long x,int n,long m,int[] c){
        long need = 0; // 需要添加的资源总量
        for(int count:c){ // 遍历每种资源的当前数量
            if(count<x){ // 如果当前资源数量小于目标数量
                need +=(x-count); // 计算需要添加的资源数量
            }
        }

        return need <= m&& need <=x; // 判断需要添加的资源总量是否不超过m和x
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务