您的位置:首页 > 其它

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

2017-02-04 18:23 183 查看
题目描述

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

总利润=单位商品利润*销量

单位商品利润=单位商品价格 - 单位商品成本 (- 税金 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
-d[i];
t:=i*d[i]-n*d
-r*(d[i]-d
);
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  洛谷 pascal