2 条题解
-
0
#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
#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
- 上传者