题目传送门
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
输入的第一行为政府对某种商品的预期价;
第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量;
接下来若干行,每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行 -1
表示所有已知价位及对应的销量输入完毕;
输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出 NO SOLUTION
。
输入 #1
31 28 130 30 120 31 110 -1 -1 15
输出 #1
4
保证输入的所有数字均小于 105。
如下图所示是输入样例所对应的价格变化图,横轴表示销售价格,纵轴表示销量。
根据题意,28 元是商品的成本。销售价格不应该低于 28 元;当销售价格大于给出的价格的最大值 31 元后,按照售价每提高一元,销量降低 15 计算,例如当售价为 33 元时,销量为110−15×(33−31)=80。在给出来的价位之间,销量呈线性变化。
当政府给该商品补贴 4 元后,企业将该商品定价为 31 元时,取得的利润为 31−28+4=7 元,销量为 110 件,总利润为 7×110=770 元,是企业在所有定价下能够取得的最大的总利润。此时企业的售价为政府的期望售价,因此是一个合法方案。
定义一个记录销售量的数组z[i]表示单价为i元时的销售量。
读入时,用a,b记录读入的数,c,d记录上次的两个数,以计算中间的线性变化。
用一个函数g(q)记录在补贴,q(给钱数,可以为负)钱时单价为多少总利润最大。
如果g(0)就是政府预期价,就输出0;如果g(0)大于政府预期价,那么一定是补贴,这样才能在单价少时得到更多的钱;反之就是税收。
暴力就只用从1枚举到一个很大的数,找到就输出并return即可。
#include
using namespace std;
int w,h,x,y,z[100010];
int g(int q)
{
int m=-100000,a;
for(int i=h;i=m)
{
m=k;
a=i;
}
}
return a;
}
int main()
{
int a,b,c,d,i;
scanf("%d%d%d",&w,&c,&d);
z[c]=d;
h=c;
while(scanf("%d%d",&a,&b)&&a!=-1&&b!=-1)
{
for(i=c+1;i<=a;i++) z[i]=d-(b-d)/(c-a)*(i-c);
c=a;
d=b;
}
scanf("%d",&y);
for(i=c+1;;i++)
{
z[i]=z[i-1]-y;
if(z[i]<0) break;
}
x=i-1;
int s=g(0);
if(s==w) printf("0");
if(s>w)
{
for(i=1;i-x;i--)
{
if(g(i)==w)
{
printf("%d",i);
return 0;
}
}
printf("NO SOLUTION");
}
return 0;
}
如有错误,欢迎大家评论区指出!感谢!