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个最大差之和,就得到最小的木板总长。