1. 程式人生 > >【洛谷】P2983 [USACO10FEB]購買巧克力Chocolate Buying(貪心)

【洛谷】P2983 [USACO10FEB]購買巧克力Chocolate Buying(貪心)

輸出格式 準備 anti radius rod money pri price -s

題目描述

Bessie and the herd love chocolate so Farmer John is buying them some.

The Bovine Chocolate Store features N (1 <= N <= 100,000) kinds of chocolate in essentially unlimited quantities. Each type i of chocolate has price P_i (1 <= P_i <= 10^18) per piece and there are C_i (1 <= C_i <= 10^18) cows that want that type of chocolate.

Farmer John has a budget of B (1 <= B <= 10^18) that he can spend on chocolates for the cows. What is the maximum number of cows that he can satisfy? All cows only want one type of chocolate, and will be satisfied only by that type.

Consider an example where FJ has 50 to spend on 5 different types of chocolate. A total of eleven cows have various chocolate preferences:

Chocolate_Type Per_Chocolate_Cost Cows_preferring_this_type 1 5 3

2 1 1

3 10 4

4 7 2

5 60 1

Obviously, FJ can‘t purchase chocolate type 5, since he doesn‘t have enough money. Even if it cost only 50, it‘s a counterproductive purchase since only one cow would be satisfied.

Looking at the chocolates start at the less expensive ones, he can purchase 1 chocolate of type #2 for 1 x 1 leaving 50- 1=49, then

purchase 3 chocolate of type #1 for 3 x 5 leaving 49-15=34, then purchase 2 chocolate of type #4 for 2 x 7 leaving 34-14=20, then purchase 2 chocolate of type #3 for 2 x 10 leaving 20-20= 0.

He would thus satisfy 1 + 3 + 2 + 2 = 8 cows.

貝西和其他奶牛們都喜歡巧克力,所以約翰準備買一些送給她們。奶牛巧克力專賣店裏

有N種巧克力,每種巧克力的數量都是無限多的。每頭奶牛只喜歡一種巧克力,調查顯示,

有Ci頭奶牛喜歡第i種巧克力,這種巧克力的售價是P。

約翰手上有B元預算,怎樣用這些錢讓盡量多的奶牛高興呢?

輸入輸出格式

輸入格式:

  • Line 1: Two space separated integers: N and B

  • Lines 2..N+1: Line i contains two space separated integers defining chocolate type i: P_i and C_i

輸出格式:

  • Line 1: A single integer that is the maximum number of cows that Farmer John can satisfy

輸入輸出樣例

輸入樣例#1: 復制
5 50 
5 3 
1 1 
10 4 
7 2 
60 1 
輸出樣例#1: 復制
8 

------------------------------------------------------------------------
分析:貪心似乎是我會的唯一方法了,開結構體,並且以價格排序,接著掃一遍,能買的就買。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100005;
typedef long long ll;
struct cow
{
    ll c,p;
}f[maxn];
bool cmp(cow a,cow b)
{
    if(a.c!=b.c) return a.c<b.c;//按價格排序 
    return a.p>b.p;//否則按牛數排序 
}
int main()
{
    ll n,m,ans=0;
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&f[i].c,&f[i].p);
    }
    sort(f+1,f+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(f[i].c<=m)
        {
            ll k=min(f[i].p,m/f[i].c);//能買多少買多少
            m-=k*f[i].c;//減去花掉的錢 
            ans+=k; //加上牛 
        }
    }
    printf("%lld",ans);
    return 0; 
}

【洛谷】P2983 [USACO10FEB]購買巧克力Chocolate Buying(貪心)