P4447 [AHOI2018初中組]分組
阿新 • • 發佈:2021-06-20
排序後掃一遍,維護當前分組方案,儘量加入人數少的組。如果某些組再也不可能加入了就統計最小值,如果每組都加入過了相同的實力值就新開一組。
因為組的資訊具有單調性,所以可以用雙端佇列 \(O(n)\) 維護。
code:
#include<bits/stdc++.h> using namespace std; #define Min(x,y)((x)<(y)?x:y) #define For(i,x,y)for(i=x;i<=(y);i++) int a[100005]; deque<pair<int,int> >deq; int main() { int n,i,mn; scanf("%d",&n); mn=n; For(i,1,n)scanf("%d",&a[i]); sort(a+1,a+n+1); For(i,1,n) { if(deq.empty()) { deq.push_back(make_pair(a[i],1)); continue; } while(!deq.empty()) if(deq.front().first+1<a[i])mn=Min(mn,deq.front().second),deq.pop_front(); else break; if(deq.empty()||deq.front().first==a[i]) { deq.push_front(make_pair(a[i],1)); continue; } deq.push_back(make_pair(deq.front().first+1,deq.front().second+1)); deq.pop_front(); } while(!deq.empty())mn=Min(mn,deq.front().second),deq.pop_front(); printf("%d",mn); return 0; }