首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。
我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n-(m-1)個人。
那麼我們現在要讓所有人都進去,那就是看n/(m-1)的數量。
但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變為m,那總數就要-1,還有如果是你算的最後一組中的進去的那一趟是0的話,就代表你不需要人出來,所以也是總數-1.其餘情況都是總數+1,因為你還存在著一些人需要再進去,而這些人一定小於m-1更加小於m。
但是!!!這題的重點是不要忘記了當任何數字模1都是0,所以要將m==2的情況單獨拿出來判斷!
因為整個數列中的數只有兩種情況,即大於等於m和小於m兩種情況,所以可以直接將原來的數列抽象成01串的形式,我們大於等於m的數為1,小於m的數為0。
又因為我們現在要讓1處於中間位置,那麼我們很容易得出:假設存在某個區間滿足題設,若想要這個區間使用的1數量最少,那麼總是存在這樣一種情況即1的數量比0的數量多1個。
由此我們可以推出,假設存在k個滿足條件的區間,其中k越大越好,那麼一定有每個區間的1數量比0數量多乙個。由此得出,區間的數量就是1的數量-0的數量,即k = cnt1 -cnt0。
假設1比0要少,顯然無法存在這樣的區間,那麼就輸出-1
#include using namespace std;
typedef long long ll;
typedef long double ld;
typedef pairpii;
int main()
if(cnt1 > cnt0) cout << cnt1-cnt2 << endl;
else cout << "-1" << endl;
}return 0;
}
比賽的時候想到了1比0多1個這個性質,但是並沒有繼續往下想這個性質與區間數量的關係,整了乙個列舉斷點+刪去不合法區間的操作...甚至還用上了棧....完全走遠了。
下次見到這種題目其實根據過題人數這麼多可以大膽猜乙個簡單結論,然後再進行證明。記錄下來長個記性qwq。
牛客寒假演算法基礎集訓營4
a 第一行是乙個正偶數 n,表示石子的堆數。第二行是 n 個正整數 a1,a2,ana1,a2,an,表示每堆石子的個數。博弈,由於每次取石子只能取最左一堆或最右一堆,且必須取完,那麼選擇奇數和和偶數和中比較大的一項,但是堆數為偶數,這無論如何先手贏。所以直接輸出就好了。include define...
牛客寒假演算法基礎集訓營1
菜雞乙個,只做出兩道,先掛一下,剩下的會了繼續更 1 小a的計算器 題目描述 小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有 即加減乘除 四種運算。經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最...
牛客寒假演算法基礎集訓營1
題意 給出乙個n m的矩陣,找出有如下條件的三角形的個數 1.三角形的三個頂點均為格點,即橫座標和縱座標均為整數。2.三角形的面積為1 3.三角形至少有一條邊和x軸或y軸平行。思路 滿足條件的三角形有兩類 1 底為1,高為2 2 底為2,高為1。使底邊分別平行於x軸和y軸,其中會有重複的,計算中減去...