洛谷——P1208 [USACO1.3]混合牛奶 Mixing Milk
阿新 • • 發佈:2017-11-26
alt ostream pre 采購 radius 牛奶 using 輸入輸出格式 return
輸出樣例#1: 復制
P1208 [USACO1.3]混合牛奶 Mixing Milk
題目描述
由於乳制品產業利潤很低,所以降低原材料(牛奶)價格就變得十分重要。幫助Marry乳業找到最優的牛奶采購方案。
Marry乳業從一些奶農手中采購牛奶,並且每一位奶農為乳制品加工企業提供的價格是不同的。此外,就像每頭奶牛每天只能擠出固定數量的奶,每位奶農每天能提供的牛奶數量是一定的。每天Marry乳業可以從奶農手中采購到小於或者等於奶農最大產量的整數數量的牛奶。
給出Marry乳業每天對牛奶的需求量,還有每位奶農提供的牛奶單價和產量。計算采購足夠數量的牛奶所需的最小花費。
註:每天所有奶農的總產量大於Marry乳業的需求量。
輸入輸出格式
輸入格式:
第 1 行共二個數值:N,(0<=N<=2,000,000)是需要牛奶的總數;M,(0<= M<=5,000)是提供牛奶的農民個數。
第 2 到 M+1 行:每行二個整數:Pi 和 Ai。
Pi(0<= Pi<=1,000) 是農民 i 的牛奶的單價。
Ai(0 <= Ai <= 2,000,000)是農民 i 一天能賣給Marry的牛奶制造公司的牛奶數量。
輸出格式:
單獨的一行包含單獨的一個整數,表示Marry的牛奶制造公司拿到所需的牛奶所要的最小費用。
輸入輸出樣例
輸入樣例#1: 復制100 5 5 20 9 40 3 10 8 80 6 30
630
說明
題目翻譯來自NOCOW。
USACO Training Section 1.3
多重背包 48(RE)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 2000100 using namespace std; int n,m,f[N],p[N],s[N]; int read() { int x=0,f=1; char ch=getchar();多重背包while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) p[i]=read(),s[i]=read(); for(int i=1;i<=n;i++) f[i]=99999; for(int i=1;i<=m;i++) for(int j=n;j>=0;j--) for(int k=0;k<=s[i];k++) if(j-k<0) break; else f[j]=min(f[j],f[j-k]+k*p[i]); printf("%d",f[n]); return 0; }
貪心
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 2000100 using namespace std; int n,m,ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } struct Node { int s,p; }node[N]; int cmp(Node a,Node b) {return a.p<b.p;} int main() { n=read(),m=read(); for(int i=1;i<=m;i++) node[i].p=read(),node[i].s=read(); sort(node+1,node+1+m,cmp); for(int i=1;i<=m;i++) { if(node[i].s<=n) ans+=node[i].s*node[i].p,n-=node[i].s; else ans+=node[i].p*n,n=0; if(n==0) break; } printf("%d",ans); return 0; }
洛谷——P1208 [USACO1.3]混合牛奶 Mixing Milk