P1208 [USACO1.3] 混合牛奶 Mixing Milk

[USACO1.3] 混合牛奶 Mixing Milk

题目描述

由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。

Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格可能相同。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天 Marry 乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。

给出 Marry 乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。

注:每天所有奶农的总产量大于 Marry 乳业的需求量。

输入格式

第一行二个整数 n , m n,m n,m,表示需要牛奶的总量,和提供牛奶的农民个数。

接下来 m m m 行,每行两个整数 p i , a i p_i,a_i pi,ai,表示第 i i i 个农民牛奶的单价,和农民 i i i 一天最多能卖出的牛奶量。

输出格式

单独的一行包含单独的一个整数,表示 Marry 的牛奶制造公司拿到所需的牛奶所要的最小费用。

样例 #1

样例输入 #1

100 5
5 20
9 40
3 10
8 80
6 30

样例输出 #1

630

提示

【数据范围】
对于 100 % 100\% 100% 的数据:
0 ≤ n , a i ≤ 2 × 1 0 6 0 \le n,a_i \le 2 \times 10^6 0n,ai2×106 0 ≤ m ≤ 5000 0\le m \le 5000 0m5000 0 ≤ p i ≤ 1000 0 \le p_i \le 1000 0pi1000

题目翻译来自 NOCOW。

USACO Training Section 1.3

我的代码

#include<iostream>
#include<cstdio>
using namespace std;
void sort(int,int);
struct milk{
    int v;
    int n;
}a[5001];
void sort(int l,int r){
    int i,mid,j,t;
    i=l;j=r;
    mid=a[(l+r)/2].v;
    while(i<=j){
	    while(a[i].v<mid){
            i++;
        }
        while(a[j].v>mid){
            j--;
        }
        if(i<=j){
            t=a[i].v;
            a[i].v=a[j].v;
            a[j].v=t;
            t=a[i].n;
            a[i].n=a[j].n;
            a[j].n=t;
            i++;
            j--;
        }
    }
    if(l<j) sort(l,j);
    if(i<r) sort(i,r);
}
long long wmilk;
long long ans=0;
int n;
int main(){
    scanf("%lld%d",&wmilk,&n);
    int i,j,k=0;
    for(i=1;i<=n;i++){
        cin>>a[i].v>>a[i].n;
    }
    sort(1,n);
    while(wmilk>a[k].n){
        ans+=a[k].v*a[k].n;
        wmilk=wmilk-a[k].n;
        k++;
    }
    ans+=wmilk*a[k].v;
    printf("%lld",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值