給當乙個01串,最多可以對一段區間裡的01取反一次,求最多能取得的1的個數
多組資料,第一行為陣列組數t(t<=10)
每組資料第一行乙個整數n,1<=n<=1000000
第二行乙個長度為n的01字串
每組資料輸出一行代表答案
241001
41111
4思路:我們設序列中1的個數為sum,某段區間[l,r]內0的個數為a,1的個數為b,那麼翻轉這段區間後整個序列的1的個數是:sum+a-b,sum是乙個定值,因此想讓整體最大必須令a-b最大。容易想到暴力列舉區間從而計算出a-b的最大值,但是時間複雜度不允許。仔細思考後發現,其實a-b的最大值我們遍歷一遍序列就能得到,若序列a[i]=0則++cnt;若序列a[i]=1,則--cnt;這樣不就相當於cnt=a-b嗎?但是還有乙個細節需要考慮,就是當cnt<0時我們直接令cnt=0即可,因為我翻轉這個區間是為了得到正的貢獻,負貢獻的情況肯定要捨棄掉。(從樣例的第二個也可以看出來)4
#include#include#includeusing namespace std;
int main()
else
}printf("%d\n",max+sum1);
}return 0;
}
Crane 思維 貪心
今天上午比賽我出來的第五題,也是最後乙個題。題目的意思說給你乙個序列,讓你交換到1,2,3,4,5.這種序列,我一開始沒看懂題目中說的bug是怎麼回事,賽後同學說了才懂,因為是special judge 的題,所以有乙個交換限制。放上大牛的思路吧,和我一樣,我不知道怎麼寫了。尷尬 解題思路 這句提示...
A Karen and Game 思維 貪心
思路 首先如果是個正方形,那麼如果答案能算完,那麼就是唯一的個數。不然的話是個矩形,如果答案能算完,那麼先算行和列長的一邊,同樣是一行 一列消1,長的一邊消的更多 include include include include include include include include incl...
CSU 1588 合併果子 貪心
現在有n堆果子,第i堆有ai個果子。現在要把這些果子合併成一堆,每次合併的代價是兩堆果子的總果子數。求合併所有果子的最小代價。第一行包含乙個整數t t 50 表示資料組數。每組資料第一行包含乙個整數n 2 n 1000 表示果子的堆數。第二行包含n個正整數ai ai 100 表示每堆果子的果子數。每...