题目传送门:P1023 [NOIP2000 普及组] 税收与补贴问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目背景
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
题目描述
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
- 总利润 == 单位商品利润 ×× 销量
- 单位商品利润 == 单位商品价格 −− 单位商品成本(减去税金 或者 加上补贴)
输入格式
输入的第一行为政府对某种商品的预期价;
第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量;
接下来若干行,每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行 -1 -1 表示所有已知价位及对应的销量输入完毕;
输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出格式
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出 NO SOLUTION。
输入输出样例
输入 #1
31 28 130 30 120 31 110 -1 -1 15
输出 #1
4
说明/提示
数据范围及约定
保证输入的所有数字均小于 105105。
样例解释
如下图所示是输入样例所对应的价格变化图,横轴表示销售价格,纵轴表示销量。

根据题意,2828 元是商品的成本。销售价格不应该低于 2828 元;当销售价格大于给出的价格的最大值 3131 元后,按照售价每提高一元,销量降低 1515 计算,例如当售价为 3333 元时,销量为 110−15×(33−31)=80110−15×(33−31)=80。在给出来的价位之间,销量呈线性变化。
当政府给该商品补贴 44 元后,企业将该商品定价为 3131 元时,取得的利润为 31−28+4=731−28+4=7 元,销量为 110110 件,总利润为 7×110=7707×110=770 元,是企业在所有定价下能够取得的最大的总利润。此时企业的售价为政府的期望售价,因此是一个合法方案。
所以直接来个暴力枚举的算法:
1:把用户输入的价格和销量通通存进数组里。
2:如果发现有的价格和销量用户没输入则按线性的规则自己写入。
3:在用户输入的最大价格后面按用户输入的递减数量把最后所有销量不为零的价格补充完整。
4:现在,你已经有了一个存有所有销量大于等于零的价格-销量表。
5:从1/-1开始枚举所有可能的补贴或税收,并看看在每种税收或补贴下总利润最高的价格是不是政府预期价,如果是则打印。(因为从最小的开始找的)
好了,废话不多说,上代码:
#include <iostream>
#include <cmath>
using namespace std;
int a[100010][3];//用于存放价格和销量的数组
int main()
{
int i=1,j=1,k,expect,down,max,temp,cha,xl,num,s,price,p;
cin>>expect;//读入预期价
while(cin>>a[i][1]>>a[i][2]&&a[i][1]!=-1&&a[i] [2]!=-1)//如果输入的两个数不是-1,-1
{
i++;//循环变量i++
if(i>2&&a[i-1][1]-a[i-2][1]>1)//如果两个价格之间差大于一
{
i--;//回到上一个读入的销量
cha=(a[i-1][2]-a[i][2])/(a[i][1]-a[i-1][1]);//求出每次销量减少多少:销量差/价格差
temp=a[i][1];//记录下价格
for(j=a[i-1][1]+1;j<=temp;j++)//按价格递增顺序依次写入
{
a[i][1]=j;//写入价格
a[i][2]=a[i-1][2]-cha;//按销量差写入销量
i++;
}
}
}
cin>>down;//输入超过最大价格之后每次销量降低多少
i--;//因为上面的while循环最后有i++所以用i--抵消……

最低0.47元/天 解锁文章
1793

被折叠的 条评论
为什么被折叠?



