【藍橋杯】43687.贏球票

題目描述

某機構舉辦球票大獎賽。獲獎選手有機會贏得若干張球票。

主持人拿出 N 張卡片(上面寫著 1?N 的數字),打亂順序,排成一個圓圈。

你可以從任意一張卡片開始順時針數數: 1,2,3
?
?

如果數到的數字剛好和卡片上的數字相同,則把該卡片收入囊中,從下一個卡片重新數數。

直到再無法收獲任何卡片,游戲結束。囊中卡片數字的和就是贏得球票的張數。

比如:

卡片排列是:1 2 3

我們從 1 號卡開始數,就把 1 號卡拿走。再從 2 號卡開始,但數的數字無法與卡片對上,很快數字越來越大,不可能再拿走卡片了。因此這次我們只贏得了 1 張球票。

還不算太壞!如果我們開始就傻傻地從 2 或 3 號卡片數起,那就一張卡片都拿不到了。

如果運氣好,卡片排列是 2 1 3,那我們可以順利拿到所有的卡片!

本題的目標:已知順時針卡片序列,隨便你從哪里開始數,求最多能贏多少張球票(就是收入囊中的卡片數字之和)

輸入描述

第一行一個整數 N (N≤100),表示卡片數目。

第二行 N 個整數,表示順時針排列的卡片。

輸出描述
輸出一行,一個整數,表示最好情況下能贏得多少張球票。

輸入輸出樣例

示例
輸入

3
1 2 3

輸出

1

過程解析

??假設輸入的卡片數量 N = 3,每張卡片的順序是“1,2,3”
在這里插入圖片描述

??這時候,我們從1的位置(index == 0)開始數數,數到1時,1和卡片上的數字相等,則將卡片1從卡池中取出,取出后,將該位置的卡片號碼設置為0,卡池中剩下的卡牌變成“2,3”。此時我們獲得了1張球票。
在這里插入圖片描述

??接著,再從2號卡開始,重新從1開始數數,會發現剩下的都對不上,所以從1開始取,最多只能取1張票。
??卡的順序不變,我們從2的位置(index == 1)開始數數,會發現一張也拿不了。換個位置從3的位置開始數數,也是一張也拿不到。
??所以,在N = 3,每張卡片的順序是“1,2,3”的條件下,最多只能拿到1張球票。

注意:每一輪都要有一張卡牌被拿走,如果沒有卡牌被拿走,則跳出內層循環進入外層循環。

??假設輸入的卡片數量 N = 3,每張卡片的順序換成是“2,1,3”,看看會發生什么:
在這里插入圖片描述

??如果我們從2的位置(index == 0)開始數數,第一次會把“3”這張卡拿走,將該位置的數字重置為0后,然后從2繼續數,后面什么也拿不到。這種情況下最多只能拿到3張票。
在這里插入圖片描述

??如果從1的位置開始數數(index == 1),第一次會把“1”這張卡拿走,并將該位置重置為0。此時獲得的球票數為1.
在這里插入圖片描述

然后在3的位置(index == 2),繼續從1開始數數,數到2時,將“2”這張卡片拿走,這時候就已經拿下了1+ 2 = 3 張票,同時,將“2”這張卡片重置為0。
在這里插入圖片描述
??最后剩下卡牌“3”,輪空兩次后,數到“3”,將最后一張卡牌收入囊中,這時候所有卡牌被收下,一共獲得了1+2+3=6張球票。
??所以一般情況下,如果最后只剩下一張卡牌,是肯定可以拿完全部卡牌的。

??如果我們從3的位置(index == 2)開始數數,來看看發生了什么:
??第一次數到2的時候,會把卡牌2拿走,此時獲得的球票數量為2。
在這里插入圖片描述
??接著數到“1”的時候,把卡牌1拿走,此時獲得的球票數量為 2 + 1 = 3;
在這里插入圖片描述
??最后一步,把剩下的卡牌“3”拿走,此時獲得的球票數量為 2 + 1 + 3 = 6。
在這里插入圖片描述
??所以,當卡牌的順序是“2,1,3” 時,我們按位置順序從前向后依次可以取得球票的數量是 [ 3, 6 , 6 ],取得這個列表中的最大值,即為最好情況下能贏得球票的數量。

??再來看更加復雜一些的情況:假設輸入的卡片數量 N = 5,每張卡片的順序是“3、1、2、4、5”,來看看最多可以到的球票數:
在這里插入圖片描述
當從index == 0 的位置開始數數的話,我們可以獲得 4 + 5 = 9 張票;
當從index == 1 的位置開始數數的話,我們可以獲得 1 張票;
當從index == 2 的位置開始數數的話,我們可以獲得 0 張票;
當從index == 3 的位置開始數數的話,我們可以獲得 3 + 1 = 4 張票;
當從index == 4 的位置開始數數的話,我們可以獲得 0 張票;
那么,數組 [ 9, 1, 0, 4, 0 ] 中,最大的數就是9,說明該組合下最多獲得9張票。

算法流程

  1. 初始化:
    ??N 表示卡片的數量,a是一個列表,用于存儲卡片上的數字。
    ??sum_list 是一個長度為 N 的列表,用于存儲從每個位置開始數數所能獲得的球票數字之和,初始值都為 0。
  2. 外層循環
    ??使用 for i in range(N)遍歷從每個位置開始數數的情況
    ??對于每個起始位置 i,進行如下操作:
    ??k表示當前正在操作的卡片位置,初始化為i。
    ??l 表示正在數的數字,初始化為 1。
    ??b是 a的副本,用于操作而不影響原始的a 列表。
  3. 內層循環:
    ??進入 while True 無限循環,只要滿足一定條件才會跳出。
    ??首先使用 while b[k] == 0 來找到下一個未被拿走的卡片位置(因為 b[k] == 0 表示該位置卡片已被拿走)。
    ??若 b[k] == l:
    ????說明數到的數字和當前位置的卡片數字相同,將該卡片數字添加到 sum_list[i] 中。
    ????重置 l 為 1,表示重新開始數數。
    ????將 b[k] 置為 0,表示該卡片已被拿走。
    ????檢查 b 列表是否所有元素都為 0,如果是,說明所有卡片都已被拿走,結束該位置的循環。
    ??若 b[k]!= l:
    ????l 加 1,繼續數下一個數字。
    ????無論是否匹配,都將 k 移動到下一個位置,使用 k = (k + 1) % N 實現循環計數。
    ????若 l > N,說明數的數字已經超過卡片數量,結束該位置的循環。
  4. 結果輸出:

??使用 max(sum_list) 找出 sum_list 中的最大值,即為從不同位置開始數數所能獲得的最多球票數。

代碼實現

這是晏世琪同學提供的代碼,注釋掉print()語句后可以通過OJ:

# 獲取卡片數量 N
N = int(input())
# 存儲卡片上數字的列表
a = list(map(int, input().split()))
# 用于存儲從每個位置開始數能獲得的球票數字之和,初始化為長度為 N 的全 0 列表
sum_list = [0] * Nfor i in range(N):print(f"從位置 {i} 開始:")# 記錄當前數數的起始位置k = i# 初始化數數的數字為 1l = 1# 創建一個與 a 列表相同的列表 b,用于操作,避免直接修改原列表 ab = a.copy()while True:print(f"當前位置 k:{k},數數數字 l:{l},列表 b:{b}")while b[k] == 0:# 如果當前位置的數字為 0,說明該位置的卡片已被拿走,將位置移動到下一個位置k = (k + 1) % Nif b[k] == l:# 如果數到的數字與當前位置的卡片數字相同sum_list[i] += b[k]print(f"在位置 {k} 找到匹配,將 {b[k]} 加到 sum_list[{i}] 中")l = 1b[k] = 0# 標記是否所有卡片都被拿走all_zero = Truefor n in range(N):if b[n]!= 0:all_zero = Falsebreakif all_zero:# 若所有卡片都被拿走,結束該位置的循環print(f"所有卡片都已拿走,結束位置 {i} 的循環")breakelse:l += 1k = (k + 1) % Nif l > N:# 若數數數字超過卡片數量,結束該位置的循環print(f"數數數字超過 N,結束位置 {i} 的循環")break
# 找到最大的球票數字之和
max_sum = max(sum_list)
print(max_sum)
# print(sum_list.index(max_sum))

這是另外一份通過OJ的:

import os
import sysdef max_tickets(N, cards):# 初始化sum數組,用于記錄從每個起始位置開始數數能獲得的球票總數sum_tickets = [0] * N# 遍歷所有可能的起始位置for i in range(N):k = i  # 把i復制給k,因為數數一直在動,保存i的位置l = 1  # l表示數數,從1開始數# 創建一個臨時數組b來跟蹤哪些卡片已經被取走b = cards[:]while True:# 跳過已經取走的卡片(即b[k] == 0)while b[k] == 0:k = (k + 1) % N# 如果找到對應數字,累加到sum_tickets數組的sum_tickets[i]元素if b[k] == l:sum_tickets[i] += b[k]l = 1  # 每找到對應數字,將l置為1b[k] = 0  # 將該位置置為0# 判斷數組里是否全部置為0all_zero = Truefor n in range(N):if b[n] != 0:all_zero = Falsebreak# 如果數組元素全部為0,停止本次i位置的查找if all_zero:breakelse:# 如果沒找到對應數字,將l+1l += 1k = (k + 1) % N  # k每次查找都要循環+1# 如果l大于N,停止本次i位置的查找if l > N:break# 尋找最大值max_sum = -1for i in range(N):if max_sum < sum_tickets[i]:max_sum = sum_tickets[i]return max_sum# 輸入處理
N = int(input().strip())
cards = list(map(int, input().strip().split()))# 輸出結果
print(max_tickets(N, cards))

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

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

相關文章

SQL-leetcode—626. 換座位

626. 換座位 表: Seat -------------------- | Column Name | Type | -------------------- | id | int | | student | varchar | -------------------- id 是該表的主鍵&#xff08;唯一值&#xff09;列。 該表的每一行都表示學生的姓名和 ID。 ID 序列始終從 1 開始并連續…

微軟開源AI Agent AutoGen 詳解

AutoGen是微軟發布的一個用于構建AI Agent系統的開源框架,旨在簡化事件驅動、分布式、可擴展和彈性Agent應用程序的創建過程。 開源地址: GitHub - microsoft/autogen: A programming framework for agentic AI ?? PyPi: autogen-agentchat Discord: https://aka.ms/auto…

【Elasticsearch】全文搜索與相關性排序

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

用css和html制作太極圖

目錄 css相關參數介紹 邊距 邊框 偽元素選擇器 太極圖案例實現、 代碼 效果 css相關參數介紹 邊距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【React】插槽渲染機制

目錄 通過 children 屬性結合條件渲染通過 children 和 slot 屬性實現具名插槽通過 props 實現具名插槽 在 React 中&#xff0c;并沒有直接類似于 Vue 中的“插槽”機制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通過 props和 children 來實現類似插槽的功能…

【Go】Go Gorm 詳解

1. 概念 Gorm 官網&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;這是官網的介紹&#xff0c;簡單來說 Gorm 就是一款高性能的 Golang ORM 庫&#xff0c;便于開發人員提高效率 那…

【MySQL實戰】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中監控MySQL數據庫&#xff0c;如下圖&#xff1a; 可以使用mysql_exporter。 以下是一些步驟來設置和配置這個監控環境&#xff1a; 1. 安裝和配置Prometheus&#xff1a; - 下載和安裝Prometheus。 - 在prometheus.yml中配置MySQL通過添加以下內…

【Apache Doris】周FAQ集錦:第 29 期

引言 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和開發者分享有關 Apache Doris 的常見問題。 通過這個每周 FAQ 欄目&#xff0c;希望幫助社…

Linux:文件描述符fd、系統調用open

目錄 一、文件基礎認識 二、C語言操作文件的接口 1.> 和 >> 2.理解“當前路徑” 三、相關系統調用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基礎認識 文件 內容 屬性。換句話說&#xff0c;如果在電腦上新建了一個空白文檔&#xff0…

鴻蒙動態路由實現方案

背景 隨著CSDN 鴻蒙APP 業務功能的增加&#xff0c;以及為了與iOS、Android 端統一頁面跳轉路由&#xff0c;以及動態下發路由鏈接&#xff0c;路由重定向等功能。鴻蒙動態路由方案的實現迫在眉睫。 實現方案 鴻蒙版本動態路由的實現原理&#xff0c;類似于 iOS與Android的實…

計算機網絡 (42)遠程終端協議TELNET

前言 Telnet&#xff08;Telecommunication Network Protocol&#xff09;是一種網絡協議&#xff0c;屬于TCP/IP協議族&#xff0c;主要用于提供遠程登錄服務。 一、概述 Telnet協議是一種遠程終端協議&#xff0c;它允許用戶通過終端仿真器連接到遠程主機&#xff0c;并在遠程…

汽車網絡信息安全-ISO/SAE 21434解析(上)

目錄 概述 第四章-概述 1. 研究對象和范圍 2. 風險管理 第五章-組織級網絡安全管理 1. 網絡安全治理&#xff08;cybersecurity governance&#xff09; 2. 網絡安全文化&#xff08;cybersecurity culture) 3. 信息共享&#xff08;Information Sharing) 4. 管理體系…

【0393】Postgres內核 checkpointer process ③ 構建 WAL records 工作緩存區

1. 初始化 ThisTimeLineID、RedoRecPtr 函數 InitXLOGAccess() 內部會初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局變量。 下面是這四個變量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…

cursor+deepseek構建自己的AI編程助手

文章目錄 準備工作在Cursor中添加deepseek 準備工作 下載安裝Cursor &#xff08;默認安裝在C盤&#xff09; 注冊deepseek獲取API key 在Cursor中添加deepseek 1、打開cursor&#xff0c;選擇設置 選擇Model&#xff0c;添加deepseek-chat 注意這里去掉其他的勾選項&…

微調神經機器翻譯模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下載 mBART 是一個基于序列到序列的去噪自編碼器&#xff0c;使用 BART 目標在多種語言的大規模單語語料庫上進行預訓練。mBART 是首批通過去噪完整文本在多種語言上預訓練序列到序列模型的方…

潯川社團官方文章被 Devpress 社區收錄!

潯川社團官方文章被 Devpress 社區收錄&#xff01; 親愛的潯川社團成員們以及關注我們的朋友們&#xff1a; 在這個充滿活力與機遇的社團發展歷程中&#xff0c;我們迎來了一則令人振奮的喜訊&#xff01;潯川社團精心創作的官方文章&#xff0c;成功被 Devpress 社區收錄啦&a…

STM32網絡通訊之CubeMX實現LWIP項目設計(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目錄 前言 一、軟件設計 二、CubeMX實現 1.配置前準備 2.CubeMX配置 1.ETH模塊配置 2.時鐘模塊配置 3.中斷模塊配置 4.RCC及SYS配置 5.LWIP模塊配置 3.生成代碼 1.main文件 2.用戶層源文件 3.…

簡單組合邏輯

多路選擇器 在多路數據傳輸過程中&#xff0c;能夠將任意一路選出來的電路叫做數據選擇器&#xff0c;也稱多路選擇器。對于一個具有2^n個輸入和一個輸出的多路選擇器&#xff0c;有n個選擇變量&#xff0c;多路選擇器也是FPGA內部的一個基本資源&#xff0c;主要用于內部信號的…

【Unity-Game4Automation PRO 插件】

Game4Automation PRO 插件 是一個用于 Unity 引擎 的工業自動化仿真工具&#xff0c;它提供了對工業自動化領域的仿真和虛擬調試支持&#xff0c;特別是在與工業機器人、生產線、PLC 系統的集成方面。該插件旨在將工業自動化的實時仿真與游戲開發的高質量 3D 可視化能力結合起來…

【安卓開發】【Android】總結:安卓技能樹

【持續更新】 對筆者在安卓開發的實踐中認為必要的知識點和遇到的問題進行總結。 一、基礎知識部分 1、Android Studio軟件使用 軟件界面 最新的版本是瓢蟲&#xff08;Ladybug&#xff09;&#xff0c;bug的確挺多。筆者更習慣使用電鰻&#xff08;Electric Eel&#xff0…