首页 > 学院 > 开发设计 > 正文

洛谷——P1023 税收与补贴问题

2019-11-14 10:19:18
字体:
来源:转载
供稿:网友

题目描述

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

输入格式:

输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1,-1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。

输出格式:

输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”。

题解:

不得不说一句:“差点题目都没看懂!!”草稿打了半天(看了下题解),才明白是道数学题。以样例为例,设未知数x,我们要求 (31-28+x)*110>=(28-28+x)*130 (31-28+x)*110>=(29-28+x)*125 (31-28+x)*110>=(30-28+x)*120 (31-28+x)*110>=(32-28+x)*95这样便可以解出x的范围,min<=x<=max,然后根据min和max的正负号来决定输出哪个。

代码:

var d:array [0..10001] of longint; x,y:array [0..501] of longint; n,m,nm,r,l:longint; min,max:real;PRocedure init;var o,p,i,j:longint;begin readln(n); nm:=0; readln(o,p); while (o<>-1) and (p<>-1) do begin inc(nm); x[nm]:=o; y[nm]:=p; readln(o,p); end; readln(m); r:=x[1]; l:=x[nm]+y[nm] div m; if (n<r) and (n>l) then begin writeln('NO SOLUTION'); halt; end; for i:=1 to nm-1 do begin o:=(y[i]-y[i+1]) div (x[i+1]-x[i]); for j:=x[i] to x[i+1]-1 do d[j]:=y[i]-o*(j-x[i]); end; for i:=x[nm] to l do d[i]:=y[nm]-m*(i-x[nm]);end;procedure main;var i,o,t:longint;begin min:=maxlongint; max:=-maxlongint; for i:=r to l do begin o:=d[n]-d[i]; t:=i*d[i]-n*d[n]-r*(d[i]-d[n]); if (o>0) and (t/o>max) then max:=t/o; if (o<0) and (t/o<min) then min:=t/o; end; if max<-maxlongint then x[0]:=-maxlongint else if (max>0) and (max-trunc(max)>0) then x[0]:=trunc(max)+1 else x[0]:=trunc(max); if min>maxlongint then y[0]:=maxlongint else if (min<0)and (trunc(min)-min>0) then y[0]:=trunc(min)-1 else y[0]:=trunc(min); if (x[0]<0) and (y[0]>0) then begin x[0]:=0; y[0]:=0; end; if x[0]>y[0] then writeln('NO SOLUTION') else if abs(x[0])<abs(y[0]) then writeln(x[0]) else writeln(y[0]);end;begin init; main; end.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表