洛谷P1023 税收与补贴问题

题目描述

你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。

总利润=单位商品利润 * 销量单位商品利润
单位商品价格 = 单位商品成本 (- 税金 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 (ps0+x)×n>(sis0+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
'''
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值