題解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】
阿新 • • 發佈:2019-02-23
位置 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】