【发布时间】:2016-05-21 18:33:59
【问题描述】:
以下问题取自 Topcoder 的 SRM 149。即使查看了解决方案,我也不知道该怎么做。我一直在尝试这个问题一个半小时,并从解决方案开始又一个小时,但我就是无法理解它在做什么......
如果有人能给我一些关于此解决方案如何工作的提示,我将不胜感激。
问题:http://topcoder.bgcoder.com/print.php?id=250
解决方案:http://apps.topcoder.com/forums//?module=Thread&threadID=575120&start=0
SRM 149(Division II 三级)中使用的 TopCoder 问题“定价”
问题陈述 最简单形式的市场差异化是对同一产品的不同客户收取不同价格的系统。为了使总销售收入最大化,我们希望单独向每个客户收费,收取该客户愿意支付的最高价格。通常我们必须将客户分成几组,对一个组中的每个人收取相同的价格(例如商务舱、经济舱等)。 我们列出了我们产品的所有潜在客户以及每个客户愿意支付的最高金额。我们决定将它们分成四个或更少(不重叠)的组。每个组内的每个人都将获得相同的价格。我们的目标是选择最优的组和价格,以最大化我们的总销售收入。
创建一个包含方法 maxSales 的 Pricing 类,该方法采用 int[] price 包含每个潜在客户愿意支付的最高价格,并返回我们可以通过将客户分为四个或更少的组来产生的最大销售收入.
定义
类:定价 方法:maxSales 参数:int[] 返回:整数 方法签名:int maxSales(int[] price) (确保你的方法是公开的)
约束
- 价格必须包含 1 到 50 个元素(含)
- 价格的每个元素必须在 0 到 1000 之间(含)
例子
0)
{9,1,5,5,5,5,4,8,80} 回报:120 向愿意支付 80 的一位客户收取 80。 向愿意支付 8 或 9 的 2 位客户收取 8。 向愿意支付 5 的 4 位客户收取 5。 向愿意支付 4 的一位客户收取 4。 总销售收入 = 1*80 + 2*8 + 4*5 + 1*4。 (我们可以将愿意支付 1 的客户放入这些组中的任何一个,因为他不会以这些价格购买任何东西。) 1)
{17,50,2} 回报:69 我们只使用三个组,每个组包含一个客户。我们向每位顾客收取她愿意支付的最高费用。总销售收入 = 1*17 + 1*50 + 1*2 2)
{130,110,90,13,6,5,4,3,0} 回报:346 向愿意在 4 到 13 之间支付的 4 个客户中的每一个收取 4 的价格,从而从他们那里得到总共 16 个。然后向愿意支付很多费用的三个客户中的每一个收取我们所能支付的最高费用。 4*4 + 90 + 110 + 130 = 346
SOLUTION:
Arrays.sort(price);
int ret = 0;
for(int i = 0; i<price.length; i++){
for(int j = i; j<price.length; j++){
for(int k = j; k<price.length; k++){
for(int m = k; m<price.length; m++){
int rev = 0;
for(int n = 0; n<price.length; n++){
if(price[n]>=price[m]){
rev+=price[m];
}else if(price[n]>=price[k]){
rev+=price[k];
}else if(price[n]>=price[j]){
rev+=price[j];
}else if(price[n]>=price[i]){
rev+=price[i];
}
}
ret=Math.max(ret,rev);
}
}
}
}
return ret;
【问题讨论】: