[NOIP2002 提高組] 均分紙牌

題目描述

有N堆紙牌,編號分別為 1,2,…,N。每堆上有若干張,但紙牌總數必為N的倍數。可以在任一堆上取若干張紙牌,然后移動。

移牌規則為:在編號為1堆上取的紙牌,只能移到編號為2的堆上;在編號為N的堆上取的紙牌,只能移到編號為N?1的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。

現在要求找出一種移動方法,用最少的移動次數使每堆上紙牌數都一樣多。

例如N=4,4堆紙牌數分別為:

①9②8③17④6

移動3次可達到目的:

從 ③ 取4張牌放到 ④ (9,8,13,10)-> 從 ③ 取33張牌放到 ②(9,11,10,10)-> 從 ② 取11張牌放到①(10,10,10,10)。

輸入格式

兩行

第一行為:NN(NN 堆紙牌,1≤N≤100)

第二行為:A1,A2,…,An(N堆紙牌,每堆紙牌初始數,1≤Ai≤100001≤Ai?≤10000)

輸出格式

一行:即所有堆均達到相等時的最少移動次數。

輸入數據 1

4
9 8 17 6

輸出數據 1

3

根據題目描述,我們需要將所有堆的紙牌數量調整為相等,并且要求移動次數最少。通過分析可以發現,每個非目標值的堆都需要至少一次移動來調整其數量,因此最少移動次數等于需要調整的堆的數量減一(當相鄰堆都需要調整時,可以合并移動)。

以下是解決該問題的 C++ 代碼:

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n;cin >> n;vector<int> cards(n);int sum = 0;for (int i = 0; i < n; i++) {cin >> cards[i];sum += cards[i];}int avg = sum / n;for (int i = 0; i < n; i++) {cards[i] -= avg;}vector<int> prefix(n);prefix[0] = cards[0];for (int i = 1; i < n; i++) {prefix[i] = prefix[i-1] + cards[i];}int count = 0;for (int i = 0; i < n; i++) {if (prefix[i] != 0) {count++;}}cout << count << endl;return 0;
}

代碼說明:

  1. 輸入處理:首先讀取堆數n,然后讀取每堆的紙牌數量并計算總和。
  2. 計算平均值:總和除以堆數得到每堆應有的紙牌數量。
  3. 調整數組:將每堆的紙牌數量轉換為與平均值的差值。
  4. 前綴和數組:計算調整后數組的前綴和,前綴和中的每個元素表示從第一堆到當前堆的總差值。
  5. 統計非零元素:前綴和數組中非零元素的數量即為最少移動次數。

該算法的時間復雜度為 O (n),能夠高效處理題目給定的數據范圍。

讓我們通過逐步拆解問題和代碼邏輯,深入理解如何通過前綴和數組的非零元素數量確定最少移動次數。

一、問題本質分析

  1. 核心矛盾:每堆紙牌數與平均值的差異需要通過移動消除。
  2. 移動規則:每次移動只能影響相鄰堆,且移動方向受限(如堆 1 只能移到堆 2)。
  3. 關鍵觀察
    • 若某堆的紙牌數與平均值的差為d,則必須通過移動d張紙牌到相鄰堆來平衡。
    • 每次移動可以消除一個累積的不平衡(即前綴和中的非零值)。

二、代碼邏輯詳解

1. 輸入處理與平均值計算
int n;
cin >> n;
vector<int> cards(n);
int sum = 0;
for (int i = 0; i < n; i++) {cin >> cards[i];sum += cards[i];
}
int avg = sum / n;

  • 輸入處理:讀取堆數n和每堆的初始紙牌數。
  • 平均值計算:總和sum除以堆數n得到目標值avg。若紙牌總數不是n的倍數,題目保證輸入合法,因此無需處理。

2. 調整數組(差值數組)
for (int i = 0; i < n; i++) {cards[i] -= avg;
}

  • 差值數組:將每堆的紙牌數轉換為與平均值的差值。例如,若某堆初始有 9 張,平均值為 10,則差值為-1,表示需要移入 1 張紙牌。

3. 前綴和數組構造
vector<int> prefix(n);
prefix[0] = cards[0];
for (int i = 1; i < n; i++) {prefix[i] = prefix[i-1] + cards[i];
}

  • 前綴和的意義prefix[i]表示從第 1 堆到第i堆的總差值。例如,若前 3 堆的差值分別為-1, -2, 7,則prefix[2] = -1 + (-2) + 7 = 4,表示前 3 堆總共多出 4 張紙牌,需要后續堆來平衡。

4. 統計非零元素數量
int count = 0;
for (int i = 0; i < n; i++) {if (prefix[i] != 0) {count++;}
}
cout << count << endl;

  • 移動次數的來源:前綴和數組中的每個非零元素代表一個必須進行的移動步驟。例如:
    • prefix[i]為正,表示前i堆需要移出prefix[i]張紙牌;
    • 若為負,表示前i堆需要移入abs(prefix[i])張紙牌。
    • 每次移動可以消除一個非零的前綴和值,因此非零元素的數量即為最少移動次數。

三、數學證明與示例驗證

1. 數學證明
  • 前綴和的性質
    由于所有堆的總差值為 0(總和為sum - n*avg = 0),前綴和數組的最后一個元素prefix[n-1]必為 0。
  • 移動次數的推導
    假設前綴和數組中有k個非零元素,每次移動可以消除一個非零值(例如,將prefix[i]的不平衡轉移到下一堆),最終所有前綴和都變為 0,因此需要k次移動。

2. 示例分析(輸入:4 9 8 17 6)
  • 步驟 1:計算平均值
    sum = 9+8+17+6 = 40avg = 40/4 = 10
  • 步驟 2:構造差值數組
    cards = [9-10, 8-10, 17-10, 6-10] = [-1, -2, 7, -4]
  • 步驟 3:計算前綴和數組
    prefix[0] = -1
    prefix[1] = -1 + (-2) = -3
    prefix[2] = -3 + 7 = 4
    prefix[3] = 4 + (-4) = 0
    非零元素為-1, -3, 4,共 3 個,對應移動次數 3。

3. 移動過程與前綴和的關系
  • 第一次移動:從堆 3 移 4 張到堆 4。
    差值數組變為[-1, -2, 3, 0],前綴和變為[-1, -3, 0, 0]。此時非零元素減少 1 個。
  • 第二次移動:從堆 3 移 3 張到堆 2。
    差值數組變為[-1, 1, 0, 0],前綴和變為[-1, 0, 0, 0]。非零元素再減少 1 個。
  • 第三次移動:從堆 2 移 1 張到堆 1。
    差值數組全為 0,前綴和全為 0。移動次數為 3。

四、時間復雜度分析

  • 輸入處理:O(n)
  • 平均值計算:O(1)
  • 差值數組構造:O(n)
  • 前綴和數組構造:O(n)
  • 非零元素統計:O(n)
  • 總時間復雜度:O (n),可高效處理題目給定的n≤100的數據規模。

五、關鍵思想總結

  1. 差值數組:將問題轉化為消除各堆與平均值的差異。
  2. 前綴和數組:將全局的移動需求轉化為局部的累積不平衡。
  3. 貪心策略:每次移動消除一個累積的不平衡,非零前綴和的數量即為最少移動次數。

通過這種方法,我們無需模擬具體的移動過程,而是通過數學分析直接得出最優解,體現了算法設計中的抽象思維和問題轉化能力。

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

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

相關文章

【音視頻】WebRTC-Web 音視頻采集與播放

一、打開攝像頭 打開攝像頭首先需要有一個html的video標簽&#xff1a; id "local-video"&#xff0c;是為了后續的js腳本調用這個對象autoplay是設置打開后自動播放&#xff0c;playsinline則是為了兼容移動端 <video id "local-video" autoplay p…

數據治理平臺如何選?深度解析國產化全棧方案與行業落地實踐

“數據治理平臺廠商有哪些&#xff1f;”國內主流廠商包括阿里云、華為、百分點科技等&#xff0c;各有所長。其中&#xff0c;百分點科技憑借在應急管理、智慧公安及央國企數字化領域的深度實踐&#xff0c;打造了行業特色鮮明的數據治理解決方案。百分點科技的數據治理解決方…

限流算法詳解:固定窗口、滑動窗口、令牌桶與漏桶算法全面對比

限流&#xff08;Rate Limiting&#xff09;是保障系統穩定性和服務質量的關鍵機制&#xff0c;尤其在高并發、突發流量、攻擊防護等場景中至關重要。本文將詳細介紹四種主流限流算法&#xff1a;固定窗口&#xff08;Fixed Window&#xff09;滑動窗口&#xff08;Sliding Win…

Sentinel 搭建應用層面與網關層面的流控保護

源碼&#xff1a;妖精的尾巴/spring-cloud-alibaba Nacos 和 Sentinel Dashboard 我這里全是使用window 本地運行的&#xff0c;需要自行下載運行 服務層面&#xff1a; 當你在某個具體的服務上使用Sentinel時&#xff0c;更多的是關注該服務內部資源的保護。例如&#xff0c…

純血鴻蒙 AudioRenderer+AudioCapturer+RingBuffer 實現麥克風采集+發聲

總共兩個類&#xff0c;放到代碼里&#xff0c;就可以快速完成K歌的效果&#xff0c;但應用層這么做延遲是比較高的&#xff0c;只是做一個分享。 類代碼 import { audio } from kit.AudioKit; import { BusinessError } from kit.BasicServicesKit; import { AudioBufferFlow,…

洛谷 P1601 A+B Problem(高精)普及-

題目描述 高精度加法&#xff0c;相當于 ab problem&#xff0c;不用考慮負數。 輸入格式 分兩行輸入。a,b≤10500a,b \leq 10^{500}a,b≤10500。 輸出格式 輸出只有一行&#xff0c;代表 ababab 的值。 輸入輸出樣例 #1 輸入 #1 1 1輸出 #1 2輸入輸出樣例 #2 輸入 #2 1001 909…

Matrix Theory study notes[6]

文章目錄linear spacereferenceslinear space a basis of linear space VkV^kVk,which is x1,x2,...xkx_1,x_2,...x_kx1?,x2?,...xk?,can be called as a coordinate system.let vector v∈Vkv \in V^kv∈Vk and it can be linear expressed on this basis as va1x1a2x2...…

專線與專線之間的區別

下面我們從定義、技術特點、適用場景、優缺點等多個維度來詳細對比&#xff1a;? 一、四種方案簡要定義技術方案定義MPLS 專線運營商基于 MPLS 技術提供的私有虛擬網絡&#xff0c;邏輯隔離、安全可靠VPN over Internet利用公網加密通道&#xff08;如IPSec&#xff09;構建虛…

Git工作流:團隊協作的最佳實踐

目錄 一、什么是 Git 工作流&#xff1f;為什么需要它&#xff1f; 二、基礎&#xff1a;Git 分支核心概念 三、主流 Git 工作流實戰指南 1. 集中式工作流&#xff08;Centralized Workflow&#xff09;&#xff1a;適合小團隊 / 新手 操作步驟&#xff1a; 優缺點&#…

算法競賽階段二-數據結構(35)數據結構單鏈表模擬實現

//鏈表--鏈式存儲的線性表 //存信息和下一個節點位置&#xff0c;數據域和指針域合起來叫節點 //帶頭&#xff08;哨兵位&#xff09;下標為0 //單向&#xff0c;雙向&#xff0c;循環鏈表 //實現 單 //倆足夠大數組 // elem&#xff0c;數據域 // next &#xff0c;指針域…

《Computational principles and challenges in single-cell data integration》

1. 引言&#xff1a;單細胞數據整合的背景與重要性單細胞基因組學技術&#xff08;如scRNA-seq、scATAC-seq等&#xff09;近年來快速發展&#xff0c;能夠以單細胞分辨率揭示細胞異質性和分子機制。然而&#xff0c;不同實驗、樣本和數據模態&#xff08;如RNA表達、DNA甲基化…

蔚來汽車攜手通義靈碼入選 2025 世界人工智能大會標桿案例

7月28日&#xff0c;在2025年世界人工智能大會上&#xff0c;通義靈碼助力蔚來汽車研發效能升級成功入選2025年“人工智能”行業標桿案例薈萃。蔚來汽車已有近 1000 名工程師常態化使用通義靈碼&#xff0c;AI 生成代碼占比超 30%&#xff0c;尤其在蔚來“天探”AI自檢系統的建…

Spring Boot中的this::語法糖詳解

文章目錄前言什么是方法引用&#xff08;Method Reference&#xff09;基本語法方法引用的四種類型1. 靜態方法引用2. 實例方法引用&#xff08;特定對象&#xff09;3. 實例方法引用&#xff08;任意對象&#xff09;4. 構造器引用this::在Spring Boot中的應用場景1. Service層…

VitePress學習筆記

VitePress學習筆記VitePress學習搭建和運行編寫內容mdvue配置站點配置配置searchsearch 提示詞替換使用第三方主題自定義主題設置文檔根目錄國際化文檔navsidebarsearch其他插件vitepress插件markdown-it插件項目開發原始需求和方案自動化流程權限限制VitePress學習 搭建和運行…

C#_創建自己的MyList列表

定義一個數據自己的列表MyList 使用上述描述列表的方式(數組) 列表內也要定義屬于自己的方法 例如 Sort排序 Add添加 等等....思路┌─────────────────────────────────────────────────────────────────…

記錄Linux下ping外網失敗的問題

最近在RK3568上進行開發測試&#xff0c;需要測試一下網絡環境&#xff0c;能否通過瀏覽器訪問外部網絡。測試情況如下&#xff1a; 1、ping內網、網關ip能ping通 2、ping外網ping不通 情況分析&#xff1a; 1、ping外網失敗&#xff08;ping 8.8.8.8也ping不通&#xff0c;說…

Redis 鍵值對操作詳解:Python 實現指南

一、環境準備 1. 安裝依賴庫 pip install redis2. 連接 Redis 數據庫 import redis# 創建 Redis 客戶端連接 r redis.Redis(hostlocalhost, # Redis 服務器地址port6379, # Redis 端口db0, # 數據庫編號&#xff08;0~15&#xff09;passwordNone, …

制造業企業大文件傳輸的痛點有哪些?

在全球化與數字化的浪潮下&#xff0c;制造業企業的大文件傳輸需求日益凸顯&#xff0c;然而諸多痛點也隨之而來&#xff0c;嚴重制約著企業的高效運營與發展。復雜網絡環境導致傳輸穩定性差制造業企業常涉及跨地域、跨國的業務合作與數據交流&#xff0c;網絡環境復雜多變。在…

低速信號設計之 MDIO 篇

一、引言? 在服務器的網絡子系統中,MDIO(Management Data Input/Output)總線雖然傳輸速率相對較低,卻扮演著極為關鍵的角色。它主要負責在 MAC(Media Access Control)層器件與 PHY(Physical Layer)層器件之間搭建起通信的橋梁,實現對 PHY 層器件的有效管理與狀態監控…

AR技術賦能航空維修:精度與效率的飛躍

在航空工業領域&#xff0c;飛機維修與裝配的精度要求越來越高。傳統的維修方法依賴人工操作和經驗判斷&#xff0c;容易產生誤差。隨著增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術的引入&#xff0c;航空維修迎來了革命性的變化。本文將探討AR技術在航空維修中…