1. 程式人生 > 其它 >Berry Jam(字首後->差值)

Berry Jam(字首後->差值)

思路:

  • 要相等,就一定會減去他們的總的差值,
  • 前/後 綴後來處理 左右2邊差值的權值。
  • 最後更新答案即可。

題目:

SWJTU—春季集訓 - Virtual Judge (vjudge.net)

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 200005

template <class G> void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='
-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } int n,m; int a[M],b[M]; int aa,bb; int p[M]; int T; int main(){ read(T); while(T--) { read(n);aa=0,bb=0; for(ri i=1;i<=2*n;i++) { read(p[i]);
if(p[i]==1) { aa++; } else bb++; } if(aa==bb) { printf("0\n"); continue; } int tmp=0; for(ri i=n;i>=1;i--) { if(aa>bb) { if(p[i]==1) { tmp++; if(tmp>0
&&!a[tmp]) a[tmp]=n-i+1; } else { tmp--; } } else { if(p[i]==2) { tmp++; if(tmp>0&&!a[tmp]) a[tmp]=n-i+1; } else { tmp--; } } } tmp=0; for(ri i=n+1;i<=2*n;i++) { if(aa>bb) { if(p[i]==1) { tmp++; if(tmp>0&&!b[tmp]) b[tmp]=i-n; } else { tmp--; } } else { if(p[i]==2) { tmp++; if(tmp>0&&!b[tmp]) b[tmp]=i-n; } else { tmp--; } } } int ans=1e9; for(ri i=0;i<=abs(aa-bb);i++) { int j=abs(aa-bb)-i; if(a[i]==0&&i!=0) continue; if(b[j]==0&&j!=0) continue; ans=min(ans,a[i]+b[j]); } printf("%d\n",ans); for(ri i=0;i<=n;i++) a[i]=b[i]=0; } }
View Code