题目描述
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
总利润=单位商品利润 * 销量单位商品利润
单位商品价格 = 单位商品成本 (- 税金 or + 补贴)
输入输出格式
输入格式:
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1,-1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出格式:
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”。
题解
本题理解题意相当重要:
1. 线性关系只存在于相邻定价之间,即定价-销量图为折线图
2. 计算其他价位上的总利润时,定价也必须考虑税收/补贴
基于以上两点考虑,我们要解的是一个不等式组:
(
p
−
s
0
+
x
)
×
n
>
(
s
i
−
s
0
+
x
)
×
n
i
(p-s_0+x)\times n > (s_i-s_0+x)\times n_i
(p−s0+x)×n>(si−s0+x)×ni,其中
p
p
p为政府定价,
n
n
n为该定价下预期销量,
s
0
,
s
i
,
n
i
s_0, s_i, n_i
s0,si,ni分别表示成本、某定价、某定价对应的销量。
此不等式应对于全体
s
i
s_i
si成立,因此我们可以得到一个不等式组,求解的交集即可。
# 辅助函数,当发现缺失数据时,利用线性关系补充
def fill(low, high, dic):
delta = (dic[high]-dic[low])/(high-low)
for i in range(low+1, high):
dic[i] = dic[low] + (i-low)*delta
return dic
# 输入数据
p = int(input())
l = []
dic = {}
while True:
a = input()
if a[0] != '-':
tmp = [int(s) for s in a.split()]
l.append(tmp)
dic[tmp[0]]=tmp[1]
else:
break
d = int(input())
l = sorted(l, key=lambda x:x[0])
s0 = tmp = l[0][0] # 成本
# 补充区间数据
for [s, n] in l[1:]:
if s - tmp != 1:
dic = fill(tmp, s, dic)
tmp = s
# 补充最后一段数据
i = 1
while n - i*d > 0:
s += 1
dic[s] = n - i*d
i += 1
pn = dic[p]
full = sorted(dic.items(), key=lambda x:x[0])
low = -100000
high = 100000
# 求解不等式组
for [s, n] in full[1:]:
if pn==n:
continue
tmp = (n*(s-s0)-pn*(p-s0))/(pn-n)
if tmp > low and pn > n:
low = tmp
elif tmp < high and pn < n:
high = tmp
# print(low, high)
# 输出结果
if low > high:
print('NO SOLUTION')
elif high < 0:
print(int(high+0.1)-1)
elif low > 0:
print(int(low-0.1)+1)
else:
print(0)
'''
输入:
4011
1 79990
7999 10
-1 -1
10
输出:
-20
'''