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;
}

对快速排序稍微改进了一下,传入两个数组,对第一个排序的同时调动第二个数组的相应移动。保证排序后返回的两个数组的关系是对应的。

关于需要使用到排序的算法中,如果排序的数组元素有一定的范围,可以考虑使用不排序的情况。有点像以前的挤牛奶问题。挤牛奶的开始时间不排序,而是以开始时间为数组下标存储一个标记。。

此题也是这样,不进行快速排序,而是以价格为数组下标存储相应这个价格的牛奶数量。数组下标从小到大遍历时,把相应的总量加上。

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