去重,重复才会相撞
后缀+1,后缀-1
操作前可以改变一个值。
求最少操作数使得数列相同。
很明显是差分。差分数组和就是操作数。
当我们改变一个数列中间的值时,最优肯定是改成与前面相同的情况。(与后面相同也行,差分数组是一样的。
当前情况,ci改变为0,ci+1改变为a+1 - a-1
特殊的,改变a1,那么只有c2改变为0
特殊的,改变an,那么只有cn改变为0
取最优情况记录。
最后差分求和。
ll a[N],n,m,x,c[N]; int main(){ int t;cin>>t; while(t--){ scanf("%lld",&n); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); } ll ans=0,re=-1,pos=0,now; for(int i=1;i<=n;++i) c[i]=a[i]-a[i-1]; for(int i=2;i<n;++i){ ll pre=fabs(c[i])+fabs(c[i+1]); ll now=fabs(a[i+1]-a[i-1]); if(pre-now>re){ re=pre-now;pos=i; } } ll now1=fabs(c[2]); ll now2=fabs(c[n]); if(re>=now1&&re>=now2){ c[pos]=0;c[pos+1]=a[pos+1]-a[pos-1]; } else if(now1>=re&&now1>=now2){ c[2]=0; } else if(now2>=re&&now2>=now1){ c[n]=0; } for(int i=2;i<=n;++i) ans=ans+fabs(c[i]); cout<<ans<<endl; } return 0; }
矩阵中找三个相同值的点,凑一个三角形,要求面积最大。三角形有一边垂直或
值范围为0-9,都要输出
存入的时候,把每个值能到达的左上,右上,左下,右下都储存下来。
当前值点数小于2的没有三角
跑一遍矩阵,找当前点值能在四个方向上凑出的最大值。
Codeforces Round #688 (Div. 2)
原文:https://www.cnblogs.com/PdrEam/p/14088267.html