取石子遊戲簡化版

2022-08-20 22:51:15 字數 742 閱讀 9903

給定\(n\)個雙端佇列,每次只能在兩端取,求先手與後手的最大的取值和。

(\(\sum len \leq 1000000\))

這是hnoi2023年一題的簡化版,實質不變。

廢話不多說,直接講思路。

(\(n \leq 1000000\))應該可以一眼看出是貪心吧。貪心就肯定是先手選最大的值,但顯然不符合這題。

先玩一下小樣例,若有三個數 \(a_1, a_2, a_3\),若 \(a_1\) 或 \(a_3\) 最大的話,那麼滿足先手優先選大的值。若\(a_2\)最大的話,那麼後手肯定選了\(a_2\),且先手肯定選了\(a_1,a_3\)。對於這種情況,無論怎麼選,先手與後手的差值不變,恒為\(a_1+a_3-a_2\)。

所以直接把這三個數合併就好了,因為知道他們的差值與所有的數的和,就可以知道兩者的值。

那麼合併完後,顯然每個佇列都是v字形,或單調遞增,或單調遞減。

下面,證明一下先選大的是正確的。(雖然很顯然)

設最大值為\(x\),若先手選了乙個嚴格小於\(x\)的\(y\),此時後手去選\(x\)留給先手的局面是不變的,所以不選最大值肯定錯。

基於必選最大值,數值大的一定比數值小的能先選,形象一點,你為什麼把最大值留給別人,還去刨了乙個較小的出來。

所以處理完後直接sort就好了。

(**就鴿了)

對於貪心神題,要大膽猜想,玩小樣例找一般規律,合併是貪心中的比較常見的操作。

ps:(這篇原題題解本來下午就打好了,結果被fcz刪了。。。)

報表製作簡化版

機房收費系統無論是重構還是第一版,都用到了報表,為什麼在乙個系統中要新增報表呢?報表的作用是什麼呢?報表百科。我理解的報表是 向上級報告情況的乙個媒介,沒有固定的格式。之前在專案中,我們真正給企業做過一次報表,是以匯出word的形式生成的,大概格式如圖 這次在自己的 機房收費系統 中設計報表,我使用...

飛機大戰 簡化版

import pygame from pygame.locals import import random import time class herobullet def init self,x,y,windows self.x x self.y y self.windows windows se...

簡化版桶排序

例 讓計算機隨機讀入 5個數然後將這 5個數從大到小輸出 輸入 5 3 5 2 8 輸出 8 5 5 3 2 思路 先申請乙個大小為 11 的陣列 int a 11 現在你已經有了 11 個變數,編號從 a 0 a 10 剛開始,我們將 a 0 a 10 都初始化為 0,表示這些0 10的數字還沒出...