[USACO1.3]混合牛奶 Mixing Milk - 洛谷
解题思路:
1.此题和部分背包问题相同,设置结构体数组,两个变 量分别为牛奶的单价和牛奶的重量,用x和y来表示
2. 依次输入m个农民的单价和数量,将单价从小到大排 序
3. 从数组下标1开始遍历,如果背包承重量大于等于当前 牛奶的重量,那么计算花费,背包重量减小,将下标 赋值给temp书签,如果当前背包小于牛奶重量退出循 环
4. 判断书签temp的位置,temp+1<=m?,如果是,说明 在第三步中,没有遍历完,即在中间可能背包载重量 小于当前牛奶的重量,所以再次计算背包剩余空间装 满当前牛奶的花费,如果是刚好装满,n为0的情况也 同样可以包含
5. 输出总价,在这里sum为long long型,防止溢出
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}a[10005];
bool cmp(node xx,node yy)
{
return xx.x<yy.x;//按照单价从小到大排序
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>a[i].x>>a[i].y;//输入单价和数量
sort(a+1,a+m+1,cmp);//排序
long long sum=0;//计算总花费
int temp;//设置书签,标记遍历到哪个农民
for(int i=1;i<=m;i++)
{
if(n>=a[i].y)//如果当前背包大于等于牛奶重量
{
sum=sum+a[i].x*a[i].y;//计算花费
n=n-a[i].y;//背包承重量减小
temp=i;//标记
}
else
break;
}
if(temp+1<=m)//如果书签没有遍历完
{
sum+=a[temp+1].x*n;//将牛奶分割计算花费
}
cout<<sum;
return 0;
}