Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #define Nmax 200001 /// N-ul maxim
- #define INF 2000000001 /// Valoarea pentru infinit
- using namespace std;
- int n,a[Nmax];
- inline int MIN(int x,int y,int z)
- {
- return min(min(x,y),z);
- }
- inline int MAX(int x,int y,int z)
- {
- return max(max(x,y),z);
- }
- int cautbin(int I)
- {
- int j=n-1,mij,SUM1,SUM2,st=I,dr=n-1,Dif=INF;
- while(st<=dr)
- {
- mij=(st+dr)/2;
- SUM1=a[mij]-a[I-1],SUM2=a[n]-a[mij];
- if(SUM1<SUM2)
- {
- if(Dif>SUM2-SUM1)
- Dif=SUM2-SUM1,j=mij;
- st=mij+1;
- }
- else
- {
- if(Dif>SUM1-SUM2)
- Dif=SUM1-SUM2,j=mij;
- dr=mij-1;
- }
- }
- return j;
- }
- int main()
- {
- int i,j,DifMIN,Pi,Pj,X,Y,Z,D;
- cin>>n;
- for(i=1;i<=n;++i)
- cin>>a[i];
- for(i=2;i<=n;++i) /// Calcularea sumelor partiale
- a[i]+=a[i-1];
- Pi=1;Pj=2; /// Pozitiile initiale ale lui i si j
- X=a[1],Y=a[2]-a[1],Z=a[n]-a[2];
- DifMIN=MAX(X,Y,Z)-MIN(X,Y,Z);
- Pi=1;Pj=2;
- X=a[1];Y=a[2]-a[1];Z=a[n]-a[2];
- DifMIN=MAX(X,Y,Z)-MIN(X,Y,Z);
- for(i=1;i<=n-2;++i) /// Pentru fiecare i=1,2,...,n-2 se cauta binar pozitia lui j
- {
- j=cautbin(i+1);
- X=a[i],Y=a[j]-a[i],Z=a[n]-a[j];
- D=MAX(X,Y,Z)-MIN(X,Y,Z);
- if(D<DifMIN)
- DifMIN=D,Pi=i,Pj=j;
- }
- cout<<Pi<<' '<<Pj<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement