Java USACO培训:在最后一个案例中混合牛奶失败
这里是混合牛奶的问题 Merry Milk Makers公司从农民那里购买牛奶,将其包装成有吸引力的1和2个单位的瓶子,然后将牛奶出售给杂货店,这样我们每个人都可以从美味的谷物和牛奶开始我们的一天 由于牛奶包装是一个很难赚钱的行业,因此尽可能降低成本很重要。帮助快乐的牛奶制造商以最便宜的方式购买农民的牛奶。MMM公司有一个非常有才华的营销部门,精确地知道他们每天需要多少牛奶来包装他们的客户 该公司与几个农民签订了合同,他们可以从他们那里购买牛奶,每个农民向包装厂出售牛奶的价格(可能)不同。当然,一群奶牛每天只能产这么多牛奶,所以农民们已经知道他们可以得到多少牛奶 每天,梅里牛奶制造商可以从每个农民那里购买整数单位的牛奶,这个数字总是小于或等于农民的限额(可能是该农民的全部产量,没有任何产量,或者介于两者之间的任何整数) 给定的: 快乐的牛奶制造商每天对牛奶的需求量 每个农民每单位牛奶的成本 每个农民可获得的牛奶量 计算快乐的牛奶制造商为满足日常牛奶需求而必须花费的最低金额 第1行:两个整数,N和M.Java USACO培训:在最后一个案例中混合牛奶失败,java,algorithm,arraylist,hashmap,greedy,Java,Algorithm,Arraylist,Hashmap,Greedy,这里是混合牛奶的问题 Merry Milk Makers公司从农民那里购买牛奶,将其包装成有吸引力的1和2个单位的瓶子,然后将牛奶出售给杂货店,这样我们每个人都可以从美味的谷物和牛奶开始我们的一天 由于牛奶包装是一个很难赚钱的行业,因此尽可能降低成本很重要。帮助快乐的牛奶制造商以最便宜的方式购买农民的牛奶。MMM公司有一个非常有才华的营销部门,精确地知道他们每天需要多少牛奶来包装他们的客户 该公司与几个农民签订了合同,他们可以从他们那里购买牛奶,每个农民向包装厂出售牛奶的价格(可能)不同。当然,
第一个值,N,(0n)//如果我们买的牛奶比我们需要的多 { 成本-=(milkToBuy-n)*价格。获取(0); } System.out.println(prices.toString()); 价格。删除(0); } File File=新文件(“milk.out”);//输出到milk.out PrintWriter PrintWriter=新的PrintWriter(文件); printWriter.println(成本); printWriter.close(); } }
我很有信心,你没有正确考虑当多个农民以相同的价格出售牛奶时会发生什么
您使用哈希映射的方式意味着您将覆盖以前农民提供的值。另一种解决方案是将每个农民提供的牛奶量和单价存储在一个结构中,然后根据最低单价对结构进行排序。然后可以在循环下遍历数组列表(直到所需的单位变为0) 我不知道java代码是什么,但是C++是我提交给USACO网站的代码:
#include <iostream>
#include <fstream>
typedef struct _PandQ
{
int milkAmount;
int unitPrice;
}PandQ;
PandQ *sortInput(int nOfFarmers,PandQ arrUnitPrices[])
{
for(int iCtr=1;iCtr<nOfFarmers;iCtr++)
{
for(int jCtr=0;jCtr<nOfFarmers-iCtr;jCtr++)
{
if(arrUnitPrices[jCtr].unitPrice>arrUnitPrices[jCtr+1].unitPrice)
{
swap(arrUnitPrices[jCtr],arrUnitPrices[jCtr+1]);
}
}
}
return arrUnitPrices;
}
int main()
{
ofstream fout("milk.out");
ifstream fin("milk.in");
int reqUnits,nOfFarmers,leastPriceTally,totPrice=0,temp=0,remainder;
int milkCtr=0;
PandQ *arrUnitPrices;
fin>>reqUnits>>nOfFarmers;
arrUnitPrices=new PandQ[nOfFarmers];
/*
to take in values of prices of farmers' milk and amount each farmer has (from file).
*/
for(int iCtr=0;iCtr<nOfFarmers;iCtr++)
{
fin>>arrUnitPrices[iCtr].unitPrice;
fin>>arrUnitPrices[iCtr].milkAmount;
}
arrUnitPrices=sortInput(nOfFarmers,arrUnitPrices);
while(reqUnits>0)
{
if(arrUnitPrices[milkCtr].milkAmount<reqUnits)
{
totPrice+=arrUnitPrices[milkCtr].milkAmount*arrUnitPrices[milkCtr].unitPrice;
reqUnits-=arrUnitPrices[milkCtr].milkAmount;
}
else if(arrUnitPrices[milkCtr].milkAmount>=reqUnits)
{
totPrice+=reqUnits*arrUnitPrices[milkCtr].unitPrice;
reqUnits=0;
}
milkCtr++;
}
fout<<totPrice<<"\n";
}
#包括
#包括
类型定义结构
{
米尔卡蒙特国际酒店;
国际单位价格;
}PandQ;
PandQ*sortInput(国际报价表,PandQ单价[])
{
对于(国际卢旺达问题国际法庭=1;卢旺达问题国际法庭>需求单位>>无武装人员;
arrUnitPrices=新的PandQ[nOfFarmers];
/*
纳入农民牛奶价格的价值和每个农民拥有的数量(来自文件)。
*/
对于(国际卢旺达问题国际法庭=0;卢旺达问题国际法庭>卢旺达问题国际法庭)。单价;
fin>>联合价格[iCtr].米尔卡蒙特;
}
arrUnitPrices=sortInput(nOfFarmers,arrUnitPrices);
而(需求单位>0)
{
if(arrUnitPrices[milkCtr].milkAmount=reqUnits)
{
totPrice+=reqUnits*arrUnitPrices[milkCtr]。单价;
需求单位=0;
}
milkCtr++;
}
foutThanks,我现在明白了。我将使用HashMap改为使用int[]数组的ArrayList。@Henry另一种选择是只存储每种价格下可用的牛奶总量(当您遇到每个农民之前遇到的价格时,将它们相加).如果你仔细分析你需要的信息,你会发现,在你知道每种价格的可用数量后,供应牛奶的是哪个农民就变得无关紧要了。--也许这就是你所做的,实际上并不清楚,但字典(考虑到排序的需要,也许通过TreeMap比HashMap更好地实现)那就行了。
#include <iostream>
#include <fstream>
typedef struct _PandQ
{
int milkAmount;
int unitPrice;
}PandQ;
PandQ *sortInput(int nOfFarmers,PandQ arrUnitPrices[])
{
for(int iCtr=1;iCtr<nOfFarmers;iCtr++)
{
for(int jCtr=0;jCtr<nOfFarmers-iCtr;jCtr++)
{
if(arrUnitPrices[jCtr].unitPrice>arrUnitPrices[jCtr+1].unitPrice)
{
swap(arrUnitPrices[jCtr],arrUnitPrices[jCtr+1]);
}
}
}
return arrUnitPrices;
}
int main()
{
ofstream fout("milk.out");
ifstream fin("milk.in");
int reqUnits,nOfFarmers,leastPriceTally,totPrice=0,temp=0,remainder;
int milkCtr=0;
PandQ *arrUnitPrices;
fin>>reqUnits>>nOfFarmers;
arrUnitPrices=new PandQ[nOfFarmers];
/*
to take in values of prices of farmers' milk and amount each farmer has (from file).
*/
for(int iCtr=0;iCtr<nOfFarmers;iCtr++)
{
fin>>arrUnitPrices[iCtr].unitPrice;
fin>>arrUnitPrices[iCtr].milkAmount;
}
arrUnitPrices=sortInput(nOfFarmers,arrUnitPrices);
while(reqUnits>0)
{
if(arrUnitPrices[milkCtr].milkAmount<reqUnits)
{
totPrice+=arrUnitPrices[milkCtr].milkAmount*arrUnitPrices[milkCtr].unitPrice;
reqUnits-=arrUnitPrices[milkCtr].milkAmount;
}
else if(arrUnitPrices[milkCtr].milkAmount>=reqUnits)
{
totPrice+=reqUnits*arrUnitPrices[milkCtr].unitPrice;
reqUnits=0;
}
milkCtr++;
}
fout<<totPrice<<"\n";
}