1. 程式人生 > 資訊 >特斯拉 CEO 馬斯克嘲諷 Rivian :一輛車都沒交付就想估值 800 億美元

特斯拉 CEO 馬斯克嘲諷 Rivian :一輛車都沒交付就想估值 800 億美元

這是個什麼玩意
簡單一想,就知道可以從左往右數
把相同的數字“摞”到一塊
如果當前格比左邊小的話,那麼顯然從小組到大組分就可以了
如果反之,更顯然需要出現只有一個人的組
用優先佇列實現這個東西就可以了.

#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;
}