P1208 [USACO1.3]ミキシングミルク(貪欲)

トピックの説明
乳業の収益性は非常に低いため、原材料(牛乳)の価格を下げることが非常に重要です。結婚乳製品が最良の牛乳購入計画を見つけるのを手伝ってください。

Marry Dairyは、一部の酪農家から牛乳を購入しており、各酪農家は、酪農加工会社に異なる価格を提供しています。さらに、各牛が1日あたり一定量の牛乳しか搾り出せないように、各酪農家は1日あたり一定量の牛乳を提供できます。毎日、マリーデイリーは、酪農家の最大生産量以下のミルクを酪農家から購入することができます。

Marry Dairyの毎日の牛乳の需要、および各酪農家から提供される牛乳の単価と生産量を示します。十分な量の牛乳を購入するための最小コストを計算します。

注:すべての酪農家の1日の総生産量は、MarryDairyの需要を上回っています。

入力形式
最初の行2つの整数n、mは、必要な牛乳の総量と牛乳を提供する農家の数を表します。

次のm行では、各行に2つの整数piとaiがあります。これらは、i番目の農家の牛乳の単価と農家が1日に販売できる牛乳の最大量を表します。

出力形式
1行には、マリーの牛乳製造会社が必要な牛乳を入手するための最小コストを表す単一の整数が含まれています。
入力
100 5
5 20
9 40
3〜10
8 80
6 30及び
出力
630
アイデア:価格が異なる場合の構造は、ソート、価格が低いと前に置かれ、そして価格が同じである場合、量は、正面に大きくなっています。暴力はやるだろう。
コードは次のように表示されます。

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
ll a[100005], b[100005];
typedef struct node
{
    
    
    int danjia;
    int liang;
}N;
N s[10000007];
bool cmp(N p, N q)
{
    
    
    if (p.danjia != q.danjia) {
    
    
        return p.danjia < q.danjia;
    }
    else {
    
    
        return p.liang > q.liang;
    }
}
int main()
{
    
    
    ios::sync_with_stdio(false);
    ll n, m;
    cin >> n >> m;
    for (ll i = 1; i <= m; i++) {
    
    
        cin >> s[i].danjia >> s[i].liang;
    }
    sort(s + 1, s + 1 + m, cmp);
    ll sum = 0;
    ll tot=0;
    for (ll i = 1; i <= m; i++) {
    
    
        if (sum+s[i].liang>=n) {
    
    
            tot += s[i].danjia * (n - sum);
            break;
        }
        else
        {
    
    
            sum += s[i].liang;
            tot += s[i].danjia * s[i].liang;
        }
    }
    cout << tot << endl;
    return 0;
}

またはこのように:

#include<bits/stdc++.h>

using namespace std;
struct niuniu
{
    int danjia;
    int nailiang;
}niu[5005];
bool cmp(niuniu a ,niuniu b)
{

    return a.danjia<b.danjia;
}
int main()
{
    int m , n;
    cin >>m >>n;
    for(int i=0;i<n;i++)
    {
        cin >>niu[i].danjia >>niu[i].nailiang;
    }
    sort(niu,niu+n,cmp);
    int money=0,shuliang=0,j=0;

    while(1)
    {
      if(shuliang>=m)
      {
          break;
      }else
      {
          shuliang+=niu[j].nailiang;
          money+=(niu[j].danjia*niu[j].nailiang);
          j++;
      }


    }
    if(shuliang>m)
    {
        money-=(shuliang-m)*niu[j-1].danjia;
    }
    cout<<money<<endl;


    return 0;
}
在这里插入代码片

おすすめ

転載: blog.csdn.net/wenchlove/article/details/111827801