特斯拉 CEO 馬斯克嘲諷 Rivian :一輛車都沒交付就想估值 800 億美元
阿新 • • 發佈:2021-08-30
這是個什麼玩意
簡單一想,就知道可以從左往右數
把相同的數字“摞”到一塊
如果當前格比左邊小的話,那麼顯然從小組到大組分就可以了
如果反之,更顯然需要出現只有一個人的組
用優先佇列實現這個東西就可以了.
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> std::priority_queue<int> q; using namespace std; int n; int a[1000001]; int k=1; int chu[1000001]; int sum=0; int now; int cnt; int cntt; int tem[10000001]; int ans=999999999; void clear(){ while(!q.empty()){ ans=min(ans,-q.top()); q.pop(); } } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } sort(a+1,a+n+1); int f=0; for(int i=1;i<=n;++i){ if(a[i]==a[i+1]){ chu[k]++; }else{ chu[k]++; k++; } } for(int i=1;i<=k;i++){ now+=chu[i]; if(a[now]!=a[now-chu[i]]+1){ clear(); } cntt=1; if(q.size()>=chu[i]){ for(int j=1;j<=chu[i];++j){ tem[cntt++]=(-q.top()+1); q.pop(); } while(!q.empty()){ ans=min(ans,-q.top()); q.pop(); } for(int j=1;j<cntt;++j){ q.push(-tem[j]); } }else{ while(!q.empty()){ tem[cntt++]=(-q.top()+1); q.pop(); } for(int j=1;j<cntt;++j){ q.push(-tem[j]); } for(int j=cntt;j<=chu[i];++j){ q.push(-1); } } } clear(); cout<<ans; return 0; }