C++_USACO_Mixing Milk
/* PROB:milk LANG:C++ */ #include<iostream> #include<fstream> using namespace std; int partion(int arr[],int arr1[],int low,int high){ int pivot=arr[low]; int pivot1=arr1[low]; int pivotkey=arr[low]; while(low<high){ while(low<high && arr[high]>=pivotkey) high--; arr[low]=arr[high]; arr1[low]=arr1[high]; while(low<high && arr[low]<=pivotkey) low++; arr[high]=arr[low]; arr1[high]=arr1[low]; } arr[low]=pivot; arr1[low]=pivot1; return low; } void qsort(int arr[],int arr1[],int low,int high){ int pivotloc=0; if(low<high){ pivotloc=partion(arr,arr1,low,high); qsort(arr,arr1,low,pivotloc-1); qsort(arr,arr1,pivotloc+1,high); } } int main(){ int require; int num_farmers; int have_got=0; int cost=0; ifstream fin("milk.in"); ofstream fout("milk.out"); fin>>require>>num_farmers; int *price=new int[num_farmers]; int *amount=new int[num_farmers]; for(int i=0;i<num_farmers;i++) fin>>price[i]>>amount[i]; qsort(price,amount,0,num_farmers-1); int i=0; while(i<num_farmers && have_got<require){ have_got+=amount[i]; cost+=price[i]*amount[i]; i++; } if(have_got>require){ cost-=(have_got-require)*price[--i]; } fout<<cost<<endl; delete[] price; delete[] amount; return 0; }
对快速排序稍微改进了一下,传入两个数组,对第一个排序的同时调动第二个数组的相应移动。保证排序后返回的两个数组的关系是对应的。
关于需要使用到排序的算法中,如果排序的数组元素有一定的范围,可以考虑使用不排序的情况。有点像以前的挤牛奶问题。挤牛奶的开始时间不排序,而是以开始时间为数组下标存储一个标记。。
此题也是这样,不进行快速排序,而是以价格为数组下标存储相应这个价格的牛奶数量。数组下标从小到大遍历时,把相应的总量加上。