C++_USACO_Barn Repair

/*
PROB:barn1
LANG:C++
*/
#include<iostream>
#include<fstream>
using namespace std;
int partion(int arr[],int low,int high){
    int pivot=arr[low];
    int pivotkey=arr[low];
    while(low<high){
        while(low<high && arr[high]>=pivotkey)
            high--;
        arr[low]=arr[high];
        while(low<high && arr[low]<=pivotkey)
            low++;
        arr[high]=arr[low];
    }
    arr[low]=pivot;
    return low;
}
void qsort(int arr[],int low,int high){
    int pivotloc=0;
    if(low<high){
        pivotloc=partion(arr,low,high);
        qsort(arr,low,pivotloc-1);
        qsort(arr,pivotloc+1,high);
    }
}

int *topMax(int arr[],int arr_len,int num){
    int *top_arr=new int[num];
    int max=0;
    for(int j=0;j<num;j++){
        max=arr[j];
        for(int i=j;i<arr_len-1;i++)
            if(arr[i+1]>arr[j]){
                max=arr[i+1];
                arr[i+1]=arr[j];
                arr[j]=max;            
            }
        top_arr[j]=max;
    }
    return top_arr;        
}
int main(){
    ifstream fin("barn1.in");
    ofstream fout("barn1.out");
    int m,s,c;
    fin>>m>>s>>c;
    int *stall=new int[c];
    int *space=new int[c-1];
    for(int i=0;i<c;i++)
        fin>>stall[i];
    qsort(stall,0,c-1);
    for(int i=1;i<c;i++)
        space[i-1]=stall[i]-stall[i-1];
    int* top_arr=topMax(space,c-1,m-1);
    int total=stall[c-1]-stall[0]+1;
    int sub_len=(m>=c?c-1:m-1);
    for(int i=0;i<sub_len;i++)
        total-=(top_arr[i]-1);
    fout<<total<<endl;
    delete[] stall;
    delete[] space;
    return 0;
}

这是我写的第一个方法,感觉不好。我先将所有牲口栏排序,时间复杂度是nlogn。相邻牲口栏之差存放在数组space中。选取前m-1个最大的差,从总长中减去这m-1个最大差之和,就得到最小的木板总长。

posted @ 2013-08-03 19:57  开心成长  阅读(237)  评论(0编辑  收藏  举报