卡牌——二分

卡牌

題目分析

想一下前面題的特點,是不是都出現了“最大邊長”,“最小的數”這種字眼,那么這里出現了“最多能湊出多少套牌”,我們可以考慮用二分。接下來我們要看一下他是否符合二段性,二分的關鍵在于二段性。

第一階段二段性分析

對于mid套牌,如果我們可以湊出來,那么我們可以確定套數小于mid的牌一定也可以,但是此時我需要找的是最多,那么mid一定比小于mid的值更大,所以小于mid的值我就不用管了,也就是我可以確定我能夠舍棄掉mid左邊的值。我還想要確定比mid更大的值是否也滿足條件,所以我要在mid的右邊繼續二分。

if (check(mid)) {l = mid;} //因為mid是符合條件的,所以我要留著它,而不是l=mid+1

對于mid套牌,如果我們不可以湊出來,那么我們可以確定大于mid的套數一定也不可以,所以大于等于mid的值我就不用管了,也就是我可以確定我能夠舍棄掉mid右邊的值。我還想要尋找比mid更小的值是否能滿足條件,所以我要在mid的左邊繼續二分。

else { r = mid - 1; }//因為mid是不符合條件的,所以我不要留著它,而不是r=mid
//主要這里出現了減法,那么求mid那么應該是(l+r+1)/2

綜上該題滿足二段性,可以用二分,二分的板子就不說了,接下來說一下check函數如何寫。

第二階段寫check函數

check(u)要實現的作用是檢查我能否湊出u套牌,也就是n種牌每一種的張數至少是n。我現在有m張空牌可以用,但是也有一個限制對于第i種牌,我手寫的個數不能超過b[i],具體請看代碼,

public static boolean check(int num) {//num為可以湊出來的卡牌組數long temp = m;//備份空白牌的數量for (int i = 0; i < a.length; i++) {//遍歷卡牌if (a[i] >= num) continue;//如果卡牌數現在不滿足至少為num張int add = num - a[i];//需要添加的撲克牌數量temp -= add;if (temp < 0) return false;//如果剩余的牌不夠if (add > b[i]) return false;//如果超過預計需要畫的牌個數}return true;}

第三階段二分范圍確定

l的值好確定,就是0,那么r呢?先來看一下a[i]的最大值是1e4,也就是每種牌我最多有4e5張,b[i]也是最多可以手寫4e5張,那么加起來就是8e5,因此r可以取8e5+5。后面的5是隨便加的數,一般要比你算出來的大一些就可以。

題目代碼

import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {static int n;static long m;static int[] a, b;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = br.readLine();n = Integer.parseInt(line.split(" ")[0]);m = Long.parseLong(line.split(" ")[1]);//空白牌的數量a = new int[n];b = new int[n];int l = 0, r = 800005;String[] s = br.readLine().split(" ");for (int i = 0; i < n; i++) {a[i] = Integer.parseInt(s[i]);}s = br.readLine().split(" ");for (int i = 0; i < n; i++) {b[i] = Integer.parseInt(s[i]);}while (l < r) {//獲取最大值int mid = (l + r + 1) / 2;if (check(mid)) {l = mid;} else {r = mid - 1;}}System.out.println(l);}public static boolean check(int num) {//num為可以湊出來的卡牌組數long temp = m;//備份空白牌的數量for (int i = 0; i < a.length; i++) {//遍歷卡牌if (a[i] >= num) continue;//如果卡牌數現在不滿足int add = num - a[i];//需要添加的撲克牌數量temp -= add;if (temp < 0) return false;//如果剩余的牌不夠if (add > b[i]) return false;//如果超過預計需要畫的牌個數}return true;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

續Java的執行語句、方法--學習JavaEE的day07

day07 一、特殊的流程控制語句 break(day06) continue 1.理解&#xff1a; 作用于循環中&#xff0c;表示跳過循環體剩余的部分&#xff0c;進入到下一次循環 做實驗&#xff1a; while(true){ System.out.println(“111”); System.out.println(“222”); if(true){ conti…

編譯鏈接實戰(25)gcc ASAN、MSAN檢測內存越界、泄露、使用未初始化內存等內存相關錯誤

文章目錄 1 ASAN1.1 介紹1.2 原理編譯時插樁模塊運行時庫2 檢測示例2.1 內存越界2.2 內存泄露內存泄露檢測原理作用域外訪問2.3 使用已經釋放的內存2.4 將漏洞信息輸出文件3 MSAN1 ASAN 1.1 介紹 -fsanitize=address是一個編譯器選項,用于啟用AddressSanitizer(地址

基于SpringBoot的教師考勤管理系統(贈源碼)

作者主頁&#xff1a;易學蔚來-技術互助文末獲取源碼 簡介&#xff1a;Java領域優質創作者 Java項目、簡歷模板、學習資料、面試題庫 教師考勤管理系統是基于JavaVueSpringBootMySQL實現的&#xff0c;包含了管理員、學生、教師三類用戶。該系統實現了班級管理、課程安排、考勤…

基于springboot的足球俱樂部管理系統的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 課題…

2024.3.3每日一題

LeetCode 用隊列實現棧 題目鏈接&#xff1a;225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09; 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&…

如何取消ChatGPT 4.0的自動續費和會員訂閱(chatgpt4.0自動續費嗎)

如何取消ChatGPT 4.0的自動續費和會員訂閱 ChatGPT 4.0自動續費是否存在 是的&#xff0c;ChatGPT 4.0 Plus會員服務存在自動續費功能。 ChatGPT 4.0 Plus會員服務自動續費 ChatGPT Plus會員服務的自動續費機制用戶在購買ChatGPT 4.0 Plus會員服務后&#xff0c;系統會自動…

npm ERR! code ERESOLVE

1、問題概述&#xff1f; 執行npm install命令的時候報錯如下&#xff1a; tangxiaochuntangxiaochundeMacBook-Pro stf % npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resol…

LeetCode102.二叉樹的層序遍歷

題目 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[9,20],[15,7]]輸入&#xff1a;root [1] 輸出&am…

SpringCloud-MQ消息隊列

一、消息隊列介紹 MQ (MessageQueue) &#xff0c;中文是消息隊列&#xff0c;字面來看就是存放消息的隊列。也就是事件驅動架構中的Broker。消息隊列是一種基于生產者-消費者模型的通信方式&#xff0c;通過在消息隊列中存放和傳遞消息&#xff0c;實現了不同組件、服務或系統…

2024全新手機軟件下載應用排行、平臺和最新發布網站,采用響應式織夢模板

這是一款簡潔藍色的手機軟件下載應用排行、平臺和最新發布網站&#xff0c;采用響應式織夢模板。 主要包括主頁、APP列表頁、APP詳情介紹頁、新聞資訊列表、新聞詳情頁、關于我們等模塊頁面。 地 址 &#xff1a; runruncode.com/php/19703.html 軟件程序演示圖&#xff1a;…

最小高度樹-力扣(Leetcode)

題目鏈接 最小高度樹 思路&#xff1a;本質上是找到樹中的最長路徑。當最長路徑上中間點&#xff08;若路經長為偶數&#xff0c;則中間點僅有一個&#xff0c;否者中間點有兩個&#xff09;作為根時&#xff0c;此時樹高最小。 Code: class Solution { public://拓撲排序int…

【深度優先搜索】【樹】【C++算法】2003. 每棵子樹內缺失的最小基因值

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 深度優先搜索 LeetCode2003. 每棵子樹內缺失的最小基因值 有一棵根節點為 0 的 家族樹 &#xff0c;總共包含 n 個節點&#xff0c;節點編號為 0 到 n - 1 。給你一個下標從 0 開始的整數數組 parents &#xff0c;其中…

第二講:用geth和以太坊交互

一&#xff1a;安裝geth brew install ethereum geth github網址&#xff1a; https://github.com/ethereum/go-ethereum 二&#xff1a; 用geth連接以太坊 以太坊有主網絡&#xff08;Ethereum Mainnet&#xff09;&#xff0c;有測試網絡&#xff08;Sepolia、Goerli 等等…

設計模式學習筆記 - 設計原則 - 5.依賴反轉原則(控制反轉、依賴反轉、依賴注入)

前言 今天學習 SOLID 中的最后一個原則&#xff0c;依賴反轉原則。 本章內容&#xff0c;可以帶著如下幾個問題&#xff1a; “依賴反轉” 這個概念指的是 “誰跟誰” 的 “什么依賴” 被反轉了&#xff1f; “反轉” 這兩個字該如何理解。我們還經常聽到另外兩個概念&#…

【分塊三維重建】【slam】LocalRF:逐步優化的局部輻射場魯棒視圖合成(CVPR 2023)

項目地址&#xff1a;https://localrf.github.io/ 題目&#xff1a;Progressively Optimized Local Radiance Fields for Robust View Synthesis 來源&#xff1a;KAIST、National Taiwan University、Meta 、University of Maryland, College Park 提示&#xff1a;文章用了s…

【Spring】20 解析Spring注解驅動的容器配置

文章目錄 注解 vs. XMLJavaConfig選項注解配置注解注入順序注解處理器實際運用總結 Spring 框架一直以 XML 配置為主導&#xff0c;然而隨著注解驅動配置的引入&#xff0c;我們不禁思考&#xff1a;是注解配置優于 XML 呢&#xff0c;還是反之&#xff1f;本篇博客將介紹 Spri…

如何將一個遠程git的所有分支推到另一個遠程分支上

如何將一個遠程git的所有分支推到另一個遠程分支上 最初有 12 個分支 執行 git remote add 遠程名 遠程git地址 git push 遠程名 --tags "refs/remotes/origin/*:refs/heads/*"之后就變成 26個分支

小項目:2024/3/2

一、TCP機械臂測試 代碼&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.254" //服務器端IP #define SER_PORT 8888 //服務器端端口號#define CLI_IP "192.168.199.131" //客戶端IP #define CLI_P…

100條數據秒殺,如何避免超賣【待補充更細的資料】

使用Redis預減庫存&#xff1a;利用Redis的原子性操作&#xff0c;如DECR命令&#xff0c;來預先減少庫存。當商品庫存數量在Redis中被減少到0時&#xff0c;后續的請求將被拒絕&#xff0c;從而確保只有限定數量的訂單能夠進入后續流程。悲觀鎖&#xff1a;在數據庫層面使用悲…

面試筆記系列八之JVM基礎知識點整理及常見面試題

目錄 類實例化加載順序 類的實例化順序 JVM創建對象的過程 JVM的運行機制 直接內存&#xff08;Direct Memory&#xff09; JVM后臺運行的線程 JVM 常用參數 標準參數中比較有用的&#xff1a; 非標準參數又稱為擴展參數&#xff0c;比較有用的是 非Stable參數 class初…