洛谷p1114
yzx已經當過多次「媒人」了。他因此獲得了許多經驗。例如,距yzx觀察,身高相近的人似乎比 較合得來。yzx在學校策劃了一次大型的「非常男女」配對活動。對於這次活動的參與者,yzx有自己獨特的選擇方式。他希望能選擇男女人數相等且身高都很接近的一些人。這種選擇方式實現起來很簡單,他讓學校的所有人按照身高排成一排,然後從中選出連續的若干個人,使得這些人中男女人數相等。yzx當然希望他能選出的人越多越好,請告訴他最多可以選出多少人來。
第一行有乙個正整數n,代表學校的人數。第二行有n個用空格隔開的數,這些數只能是0或1,其中,0代表乙個男生,1代表乙個女生。
乙個非負整數,表示最長的一段男女人數相等的子串行長度(如果不存在男女人數相等的子串行輸出0)。
9
0 1 0 0 0 1 1 0 0
6
30%的資料,n<=100。50%的資料,n<=1000。
100%的資料,n<=100000。
我首先想到的是直接o(n2)
o(n^2)
o(n2
)的兩個for迴圈直接暴力。然後我就直接這麼做了。。。傻子都知道會超時。然後我拿了60分滾蛋。
#include
#include
using
namespace std;
int n,a[
100002
],maxn;
intmain()
for(
int i=
1;i<=n;i++
)for
(int j=
1;j<=i;j++)if
(a[i]
-a[j-1]
==0) maxn=
max(maxn,i-j+1)
;printf
("%d"
,maxn)
;return0;
}
#include
#include
using
namespace std;
int n,a[
100002
],maxn;
intmain()
for(
int i=maxn+
1;i<=n;i++
)for
(int j=
1;j<=i-maxn;j++)if
(a[i]
-a[j-1]
==0) maxn=
max(maxn,i-j+1)
;printf
("%d"
,maxn)
;return0;
}
這種方法還是我自己比賽的時候yy的,我想100000
不就是要乙個o(nlogn)
o(n \log n)
o(nlogn)
的方法嗎。於是我想到了二分答案然後尺取法判斷,結果打完後發現這樣做是錯的,反例就是
maxn==n
。
某大佬思路:引入相對差的概念。即a[i]
表示第i
個位置男生人數-女生人數的差值。那麼差值相等的兩個位置之間的人數是滿足男女相等的。從此統計l[a[i]]
和r[a[i]]
。特別要注意的是a[0]=0
統計的時候要把0的位置當做差為0的起點。打了一次結果只有70於是放棄。
最後的最後,我把男生設為1,女生設為-1。先用a
陣列存一下字首和,再用l
表示l[i]
===
a[i]
時的最小的j
然後一遍o(n)o(n)
o(n)
處理就可以了。
#include
#include
using
namespace std;
int n,a[
200002
],maxn,l[
200004];
intmain()
for(
int i=
1;i<=n;i++)if
(l[a[i]
+n])
maxn=
max(maxn,i-l[a[i]
+n]);if
(!l[a[i]
+n])
l[a[i]
+n]=i;
}printf
("%d"
,maxn)
;return0;
}
略 我也不知道
JZOJ 3913 艱難的選擇
description yzx已經當過多次 媒人 了。他因此獲得了許多經驗。例如,距yzx觀察,身高相近的人似乎比較合得來。yzx在學校策劃了一次大型的 非常男女 配對活動。對於這次活動的參與者,yzx有自己獨特的選擇方式。他希望能選擇男女人數相等且身高都很接近的一些人。這種選擇方式實現起來很簡單,...
不要讓下屬選擇做艱難的抉擇
有個同事要調去做專項的工作,他手頭的日常工作要臨時分配出去。現在大家都是滿負荷運作,人力很緊張。如何分配工作的會議在比較不和諧的情況下進行,沒有誰願意再去領一些任務,現在手頭上的任務都處理不過來了。會議的結果是定了乙個方向 由兩個同事分別承擔一些任務,但是任務的分配由這兩個同事自己協商解決。我當時處...
做了乙個艱難的選擇 2020 05 20
前幾天又被原本的學校開除了,想了很久很久,和父母溝通了幾晚上他們決定把我送到離家三百公里的合肥進了一所某合肥職業學院.學的是計算機專業,但是來了幾天後發現和自己想的並不怎麼一樣,我學習的是網頁製作與設計但是實際上來了後發了幾本書上面寫著網頁製作與設計但是內容都是c語言和ps,真的也太敷衍了。來了後整...