1. 程式人生 > >Educational Codeforces Round 21 D. Array Division

Educational Codeforces Round 21 D. Array Division

nbsp 題目 位置 pac 個數 ret vision n) scanf

題目鏈接:Educational Codeforces Round 21 D. Array Division

題意:

給你n個數,現在你可以改變1<=個數的位置,然後問你是否存在有一個k,使得sum(a[i])(1<=i<=k)==sum(a[j])(k+1<=j<=n)

題解:

分析:

如果需要將一個數移動,無非就是將這個數從第一部分移到第二部分,或者從第二部分移到第一部分。

所以,我們只需要開兩個map來記錄一下兩部分有哪些數。

當兩部分的差值/2等於其中一部分的一個數時,那麽就可以YES了。

技術分享
 1 #include<bits/stdc++.h>
 2
#define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=1e5+7; 7 ll a[N]; 8 map<ll,int>mp; 9 map<ll,int>mp2; 10 int main() 11 { 12 int n;ll sum1=0,sum2=0; 13 scanf("%d",&n); 14 F(i,1,n)scanf("%lld",a+i),sum2+=a[i],mp[a[i]]++;
15 if(sum2&1){puts("NO");return 0;} 16 ll aim=sum2/2; 17 F(i,1,n) 18 { 19 ll tp=sum2-aim; 20 if(tp>0&&mp[tp]>0){puts("YES");return 0;} 21 if(tp<0&&mp2[-tp]>0){puts("YES");return 0;} 22 sum2-=a[i]; 23 mp[a[i]]--; 24 mp2[a[i]]++;
25 } 26 puts("NO"); 27 return 0; 28 }
View Code

Educational Codeforces Round 21 D. Array Division