藍橋杯 16.對局匹配

對局匹配

原題目鏈接

題目描述

小明喜歡在一個圍棋網站上找別人在線對弈。這個網站上所有注冊用戶都有一個積分,代表他的圍棋水平。

小明發現,網站的自動對局系統在匹配對手時,只會將積分差恰好是 K 的兩名用戶匹配在一起。如果兩人分差小于或大于 K,系統都不會將他們匹配。現在小明知道,這個網站總共有 N 名用戶,以及他們的積分分別是 A?, A?, ..., A?

小明想知道,最多可能有多少名用戶同時在線尋找對手,但系統卻一場對局都匹配不出來(即任意兩名用戶積分差不等于 K)?


輸入描述

  • 第一行包含兩個整數 NK
  • 第二行包含 N 個整數 A?, A?, ..., A?,表示每位用戶的積分。

數據范圍

  • 1 ≤ N ≤ 10?
  • 0 ≤ A? ≤ 10?
  • 0 ≤ K ≤ 10?

輸出描述

輸出一個整數,表示最多有多少名用戶無法被匹配(任意兩名用戶積分差不為 K)。


輸入樣例

10 0
1 4 2 8 5 7 1 4 2 8

輸出樣例

6

c++代碼

#include<bits/stdc++.h>using namespace std;int main() {int N, K, a, ans = 0;cin >> N >> K;vector<vector<int>> arr(K);vector<int> mid, mp(100005);for (int i = 0; i < N; i++) cin >> a, mid.push_back(a), mp[a]++;if (K == 0) {for (int i = 0; i <= 100004; i++) {if (mp[i] > 0) ans++;}cout << ans;return 0;}sort(mid.begin(), mid.end());for (int i = 0; i < N; i++) {if (arr[mid[i] % K].size() == 0 || arr[mid[i] % K].back() != mid[i] ) arr[mid[i] % K].push_back(mid[i]);}for (int i = 0; i < K; i++) {if (arr[i].size() == 0) continue;vector<int> dp(arr[i].size());dp[0] = mp[arr[i][0]];for (int j = 1; j < arr[i].size(); j++) {int b = j - 2 >= 0 ? dp[j - 2] : 0;if (arr[i][j] - arr[i][j - 1] == K) dp[j] = max(b + mp[arr[i][j]], dp[j - 1]);else dp[j] = dp[j - 1] + mp[arr[i][j]];}ans += dp[arr[i].size() - 1];}cout <<ans;return 0;
}//by wqs

題目解析

如果 k = 0,那么只用考慮總過出現了多少不同積分的用戶數,因為相同積分的用戶只能上線一個。

if (K == 0) {for (int i = 0; i <= 100004; i++) {if (mp[i] > 0) ans++;}cout << ans;return 0;
}

如果 k > 0,假設當前用戶積分為 x,則他能影響到的用戶積分為 x + k 和 x - k,又會因為積分為 x + k 用戶在線與否間接地影響到 x + 2k…可以發現積分對 k 求余相同的用戶可能會互相影響。如果積分對k 求余不相同,一點不會相互影響。

因此我們可以根據每個用戶積分對 k 求余的結果分成余數為 0 ~ k - 1 的組,共 k 組。此時我們只要解決每一組的最多在線人數最后求和即可注意每一分組為了方便都從小到大排序。去重,出現次數用哈希表統計。

vector<vector<int>> arr(K);
for (int i = 0; i < N; i++) cin >> a, mid.push_back(a), mp[a]++;
sort(mid.begin(), mid.end());
for (int i = 0; i < N; i++) {if (arr[mid[i] % K].size() == 0 || arr[mid[i] % K].back() != mid[i] ) arr[mid[i] % K].push_back(mid[i]);
}
dp[i]表示當前分組前i個分最多可以選擇多少人
首先第i個分不會與第i - 2,i - 3,i - 4個分矛盾,因為i與i - 1起碼差K,i - 1與i - 2起碼差K,所以i與i - 2起碼差2 * K;
如果第i個分與第i - 1個分之差不為K,說明i個分與第i - 1個分不矛盾,他跟第i - 2,i - 3,i - 4個分也不矛盾,我們肯定要選上第i個分
dp[i] = dp[i - 1] + 第i個分的人數
如果第i個分與第i - 1個分之差為K,說明i個分與第i - 1個分矛盾,他跟第i - 2,i - 3,i - 4個分不矛盾,我們可以選擇第i個分不選第i - 1個分
dp[i] = dp[i - 2] + 第i個分的人數;
我們也可以選擇第i - 1個分不選第i個分;
dp[i] = dp[i - 1];
我們取最大值
dp[i] = max(dp[i - 2] + 第i個分的人數, dp[i - 1]);
vector<int> dp(arr[i].size());
dp[0] = mp[arr[i][0]];
for (int j = 1; j < arr[i].size(); j++) {int b = j - 2 >= 0 ? dp[j - 2] : 0;if (arr[i][j] - arr[i][j - 1] == K) dp[j] = max(b + mp[arr[i][j]], dp[j - 1]);else dp[j] = dp[j - 1] + mp[arr[i][j]];
}

對于每一分組,用ans累加就行

ans += dp[arr[i].size() - 1];

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

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

相關文章

C#常用LINQ

在開發時發現別人的代碼使用到了LINQ十分便捷且清晰&#xff0c;這里記錄一下常用LINQ和對應的使用。參考鏈接&#xff1a;LINQ 菜鳥教程 使用的學生類和字符串用于測試 public class Student {public int StudentID;public string StudentName;public int Age; }Student[] st…

單例模式(線程安全)

1.什么是單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;旨在確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問該實例。這種模式涉及到一個單一的類&#xff0c;該類負責創建自己的對象&#xff0c;同時確保只有單…

Python 之 __file__ 變量導致打包 exe 后路徑輸出不一致的問題

現象 做項目的時候&#xff0c;一直使用 os.path.dirname(os.path.abspath(__file__)) 來獲取當前目錄。然而&#xff0c;最近卻遇到了一個路徑相關的問題。直接運行 py 文件是正常的&#xff0c;但是打包成 exe 之后&#xff0c;卻顯示因為路徑問題導致程序報錯無法繼續執行。…

PH熱榜 | 2025-04-21

1. Google Whisk 2.0 標語&#xff1a;將圖像轉換為八秒的動畫短片。 介紹&#xff1a;Whisk 是谷歌實驗室的一項新創新&#xff0c;現在推出了 Whisk Animate——它可以將你的圖片轉換成生動的8秒視頻&#xff0c;采用了 Veo 2 技術。此功能現已在60多個國家的 Google One A…

AI大模型 —— 國產大模型 —— 華為大模型

有這么一句話&#xff0c;那就是AI大模型分兩種&#xff0c;一種是大模型&#xff1b;另一種是華為大模型。 如果從技術角度來分析&#xff0c;華為的技術不論是在軟件還是硬件都比國外的大公司差距極大&#xff0c;甚至有些技術評論者認為華為的軟硬件技術至少落后2.5代&#…

FPGA 中 XSA、BIT 和 DCP 文件的區別

在 FPGA&#xff08;現場可編程門陣列&#xff09;開發中&#xff0c;XSA、BIT 和 DCP 文件是常見的文件類型&#xff0c;它們在功能、用途、文件內容等方面存在明顯區別&#xff0c;以下是詳細介紹&#xff1a; 1. XSA 文件 定義與功能 XSA&#xff08;Xilinx Shell Archiv…

MH2103系列coremark1.0跑分數據和優化,及基于arm2d的優化應用

CoreMark 1.0 介紹 CoreMark 是由 EEMBC&#xff08;Embedded Microprocessor Benchmark Consortium&#xff09;組織于 2009 年推出的一款用于衡量嵌入式系統 CPU 或 MCU 性能的標準基準測試工具。它旨在替代陳舊的 Dhrystone 標準&#xff08;Dhrystone 容易受到各種libc不同…

云原生與AI的關系是怎么樣的?

云原生與AI的結合正在重塑現代應用的開發與部署模式&#xff0c;兩者相輔相成&#xff0c;共同推動技術創新與產業升級。以下是兩者的核心概念、結合點及未來趨勢的詳細解析&#xff1a; 一、云原生與AI的核心概念 云原生&#xff08;Cloud Native&#xff09; ? 定義&#…

【CentOs】構建云服務器部署環境

(一) 服務器采購 2 CPU4G 內存40G 系統盤 80G 數據盤 (二) 服務器安全組和端口配置 (三) 磁盤掛載 1 登錄 root 2 查看目前磁盤使用情況 df -h 3 查看磁盤掛載情況 識別哪些磁盤沒掛載 fdisk -l 4 對未掛載磁盤做分區 fdisk /dev/vdb 輸入m&#xff0…

LangChain4j語言模型選型指南:主流模型能力全景對比

LangChain4j語言模型選型指南&#xff1a;主流模型能力全景對比 前言 在大語言模型應用開發中&#xff0c;選擇合適的底層模型提供商是架構設計的關鍵決策。LangChain4j作為Java生態的重要AI框架&#xff0c;其支持的20模型提供商各有獨特的優勢場景。本文通過功能矩陣深度解…

2025.4.21日學習筆記 JavaScript String、Array、date、math方法的使用

1. String&#xff08;字符串&#xff09; String 對象用于處理和操作文本數據。 length&#xff1a;返回字符串的長度。 const str "Hello"; console.log(str.length); // 輸出: 5 charAt(index)&#xff1a;返回指定索引位置的字符。 const str "Hello…

(14)VTK C++開發示例 --- 將點投影到平面上

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;VTK開發 &#x1f448; 1. 概述 計算一個點在一個平面上的投影。 vtkPlane 是 VTK&#xff08;Visualization Toolkit&#xff09;庫中的一個類&…

電子電器架構 ---軟件定義汽車的電子/電氣(E/E)架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

Android開發中的復制和粘貼

Android 提供了一個強大的基于剪貼板的框架&#xff0c;用于復制和粘貼。它支持簡單和復雜的數據類型&#xff0c;包括文本字符串、復雜數據結構、文本和二進制流數據&#xff0c;以及應用資源。簡單的文本數據直接存儲在剪貼板中&#xff0c;而復雜的數據則存儲為引用&#xf…

【STM32單片機】#10.5 串口數據包

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 實驗&…

百度暑期實習崗位超3000個,AI相關崗位占比87%,近嶼智能攜AIGC課程加速人才輸出

今年3月&#xff0c;百度重磅發布3000暑期實習崗位&#xff0c;聚焦大模型、機器學習、自動駕駛等AI方向的崗位比例高達87%。此次實習崗位涉及技術研發、產品策劃、專業服務、管理支持、政企解決方案等四大類別&#xff0c;覆蓋超300個崗位細分方向。值得一提的是&#xff0c;百…

vue3 + element-plus中el-dialog對話框滾動條回到頂部

對話框滾動條回到頂部 1、需要對話框顯示后 2、使用 nextTick 等待 Dom 更新完畢 3、通過開發者工具追查到滾動條對應的標簽及class“el-overlay-dialog” 4、設置屬性 scrollTop 0 或者 執行方法 scrollTo(0, 0) // 對話框顯示標識 const dialogVisible ref(false); //…

C++學習之游戲服務器開發十一DOCKER的基本使用

目錄 1.多實例部署方案 2.容器的概念 3.docker初識 4.docker倉庫 5.docker鏡像 6.docker容器 7.docker和虛擬機的區別 8.docker命令解釋 9.dockerfile構建鏡像 10.離線分發鏡像 1.多實例部署方案 redis 命令&#xff08; redis-cli XXXX &#xff09; set key value:…

2025.4.21總結

工作&#xff1a;開了一場關于大模型版本的會議&#xff0c;回歸一個問題單&#xff0c;提了兩個單&#xff0c;把用例都執行完。如今都四月中旬了&#xff0c;上班年快要結束了&#xff0c;該到了沖刺KPI的時候了。 今日思考&#xff1a;刷到了jack叔叔的視頻&#xff0c;講了…

vite安裝及使用

沒特殊要求的項目,還是怎么簡單怎么來╮(╯▽╰)╭ 一、Vite 基礎知識 1. 什么是 Vite? Vite 是一個前端構建工具,專注于開發服務器速度和優化構建過程。特點: 快速冷啟動:利用 ES 模塊的原生支持,實現快速的開發服務器啟動。即時熱更新:在開發過程中,修改代碼后可以…