1. 程式人生 > >題解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】

題解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】

位置 using amp 即將 現在 加強 分享圖片 clas 移動

其實根本沒有一樓dalao描述的那麽麻煩......

一樓dalao其實吧,采用了一種純屬模擬的方式。

下面是我的大躍進思想

但是一個個地做減法是不是太慢了?(大躍進思想)
於是我們是不是可以直接進行一個大跨步式的方法

你的奶我直接全都要了?

敲一個偽代碼理解一下

while (當前需要奶量)
{
    if (奶農的提供量<=現在的需求量)
    {
        現在的需求量-奶農的提供量
        你的money-奶農的提供量*奶農的單價
        換一個奶農//這個的提供量已經=0
    }
    else
    {
        你的money-剩余需求量*奶農的單價
        需求量=0
    }
}

然後這個算法的優勢就是大躍進
讓一個奶農不用分批次給你送牛奶(n--)
直接一步到位,多快好省
然後貼上高清打碼的代碼

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
typedef long long int lli;
lli n,m,sum;
struct nainong{
    lli dj,num;
    void input(){cin>>this->dj>>this->num;}
}milk[5001],*now=&milk[1];
bool cmp(const nainong &a,const nainong &b)
{
    if (a.dj!=b.dj)return a.dj<b.dj;
    else return a.num>b.num;
}

int main()
{
    cin>>n>>m;
    for (register int i=1;i<=m;i++)
    {
        milk[i].input();
    }
    sort(milk+1,milk+m+1,cmp);
    while (n)//當任務還沒有完成的時候
    {
        if (now->num<=n)//如果這個奶農產出的奶不夠用
        {
            n-=now->num;//減掉這個奶農的產量(我全都要了qwq)
            sum+=(now->dj)*(now->num);//加上這個奶農的要價
            now++;//移動到下一個位置(or——奶農qwq)
        }
        else//奶農產出的奶量不足(任務即將完成)
        {
            sum+=(now->dj)*n;//買到最後的奶
            n=0;//任務完成
        }
    }
    cout<<sum;
    return 0;
}

然後呢,看看兩個代碼之間的差距:
技術分享圖片
(十分建議@chen_zhe 數據加強卡一下,逃qwq)

題解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】