2 条题解

  • 0
    @ 2024-5-1 21:21:33
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    struct node{ll N,S,W;}a[101000];
    ll n,ans,p=1;
    int main(){
    	cin>>n;
    	for(ll i=1;i<=n;i++) cin>>a[i].S;
    	for(ll i=1;i<=n;i++)
    		a[i].N=i+1;
    	a[n].N=1;
        // 记录当前房间的下一个房间的编号
    	for(ll i=1;i<=2*n;i++){
    		if(a[p].S>1){
    			a[a[p].N].S+=a[p].S-1;
    			a[a[p].N].W+=a[p].S-1;
    			a[p].S=1;
    		}
    		p=a[p].N;
    	}
    	for(ll i=1;i<=n;i++) ans+=(a[i].W*a[i].W);
    	printf("%lld",ans);
    	return 0;
    }
    
    • 0
      @ 2023-9-20 17:11:37

      image

      #include <bits/stdc++.h>
      #define ll long long
      #define mid (l+r>>1)
      using namespace std;
      const int N=105;
      int n,m,k,s,t,a[N],sum[N],mi1[N],mi2[N];//前后缀 
      ll ans;
      ll dist(ll a,ll b){
      	if (a<=b) return (a-b)*(a-b);
      	return (n-a+b)*(n-a+b);
      }
      int main(){
      	cin>>n;
      	mi1[0]=mi2[n+1]=0x3f3f3f3f;
      	for (int i=1;i<=n;++i){
      		cin>>a[i];
      		sum[i]=a[i]+sum[i-1];
      		mi1[i]=min(mi1[i-1],sum[i]-i);
      	}	
      	for (int i=n;i>=1;--i) mi2[i]=min(mi2[i+1],sum[i]-i);
      	for (int i=1;i<=n;++i){
      		if (sum[n]-sum[i]+(n-i)+mi1[i]>=0 && mi2[i+1]>=sum[i]-i){
      			k=i;break;
      		}	
      	}
      	for (int now=k%n+1,i=k%n+1;;i=i%n+1){
      		while (a[now]==0) now=now%n+1;
      		--a[now];
      		ans+=dist(now,i);
      		if (i==k) break;
      	}
      	cout<<ans;
      } 
      
      
      
      
      • 1

      信息

      ID
      507
      时间
      2000ms
      内存
      250MiB
      难度
      6
      标签
      递交数
      23
      已通过
      11
      上传者