Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求变态数据

Posted by qianyun at 2012-05-26 14:33:48 on Problem 1153
不知道哪里错了,总是WA

#include<iostream>
#include<algorithm>

using namespace std;

const long SEG=10000000;

class Safe {
public:
	Safe() {
		cin>>N;
		one=new long[N];
		two=new long[N];
		for(long i=0;i<N;i++)
			cin>>one[i];
		std::sort(one, one+N);
		result=0;
	}
	double getresult() { 
		caldistance();
		return result;
	}
    ~Safe() {
        delete [] one;
        delete [] two;
    }
private:
	void caldistance() {
        double tempresult = 0;
        for(long i=0; i<N-1; i++)
            two[i] = one[i+1]-one[i];
        two[N-1]=SEG-one[N-1]+one[0];
        long symetric, isymetric, numleft=0, numright=0;
        symetric = one[0] + SEG/2;
        while(one[numleft] < symetric && numleft < N) numleft++;
        numright = N - numleft +1;
        for(long i=1; i<numleft; i++)
            tempresult += one[i] - one[0];
        for(long i=numleft; i<N; i++)
            tempresult += SEG - one[i] + one[0];
        result = tempresult;
        for(long index=1; index<N; index++) {
            if(one[index]==one[index-1]) continue;
            isymetric = one[index-1] + SEG/2;
            symetric = one[index] + SEG/2;
            if(symetric <= SEG) {
                tempresult -= two[index-1] * (numleft - index);
                while(one[numleft] < symetric) {
                    if(numleft >= N) {
                        break;
                    }
                    tempresult = tempresult + (one[numleft]-one[index]) - (SEG - one[numleft] + one[index-1]);
                    numleft++;
                }
                numright = N - numleft + index;
                tempresult += two[index-1] * numright;
            }
            else {
                symetric-=SEG;
                if(isymetric <=SEG) {                    
                    tempresult -= two[index-1] * (numleft - index);
                    while(true) {
                        if(numleft >= N) {
                            break;
                        } 
                        tempresult = tempresult + (one[numleft]-one[index]) - (SEG - one[numleft] + one[index-1]);
                        numleft++; 
                    }
                    numleft=0;
                    while(one[numleft] < symetric) {
                        if(numleft >= N) {
                            break;
                        } 
                        tempresult = tempresult + (one[numleft]-one[index]) + (SEG + one[numleft] - one[index-1]);
                        numleft++;
                    }
                    numright = index - numleft;
                    tempresult += two[index-1] * numright;
                }
                else {
                    if(numleft==N) numleft=0;
                    tempresult -= two[index-1] * (numleft + N - index);
                    while(one[numleft] < symetric) {
                        if(numleft >= N) {
                            break;
                        }
                        numleft++;
                        tempresult = tempresult + (one[numleft]-one[index]) + (SEG + one[numleft] - one[index-1]);
                    }
                    numright = index - numleft;
                    tempresult += two[index-1] * numright;
                }
            }
            if(tempresult < result)
                result = tempresult;
        }
	}
	long N;
	long* one;
	long* two;
	double result;
};

int main() {
	Safe safe;
	printf("%.0lf\n",safe.getresult());
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator