codevs1016
2015-07-18 11:49
253 查看
题目地址:http://codevs.cn/problem/1016/
分析:
我先来说说题目的意思。就从样例开始分析。
输入是:
31
28 130
30 120
31 110
-1 -1
15
意思就是政府预期价是31元。成本28元,按成本销售的时候可以买130件产品。
每个卖30元的时候可以卖120个,
每个卖31元(输入的最高价位)的时候可以卖110个,
每个卖32元的时候可以卖:110-15=95个。
每个卖33元的时候可以卖:110-15-15=80个。
每个卖34元的时候可以卖:110-15-15-15=65个。
...
因为“相邻价位之间的销量变化是均匀的”,因此28元卖130个,30元卖120个就可以知道
29元卖125个(平均每元减少的销量是(130-120) div (30-28)=5)
输出是4,我们来解释一下为什么是4。
4代表补贴是4元,所以:
在卖28元的时候,总利润是:(28-28+4)*130=520元,
在卖29元的时候,总利润是:(29-28+4)*125=625元,
在卖30元的时候,总利润是:(30-28+4)*120=720元,
在卖31元的时候,总利润是:(31-28+4)*110=770元,
在卖32元的时候,总利润是:(32-28+4)*95=760元,
...
在卖38元的时候,总利润是:(38-28+4)*5=70元,
显然可能的价位就是28~38了。(不能低于成本,卖39的时候销售量就是负数了)
可以看出,现在卖31元最划算,所以人们都愿意卖31元,这样一来不就达到政府的目的了吗!!
而当补贴是0,1,2,3的时候卖31元并不是最划算的,政府的目的达不到,你当然就没有分啦!
题意清楚了吗?好,下面分析思路。
穷举显然可以,但是没有什么意思,留给大家自己写。下面讲我的另外一种算法,数学味道要浓一些,
希望大家坚持看完。
由于需要N元钱最划算,相当于使N元钱的利润大于等于每种价格的利润。因此可以分别考虑。
设补贴为x,则N元钱的利润是:(p为成本)
(N-p+x)*d
=(N-p)*d
+x*d
因此N元钱比M元钱划算的时候有:
(N-p)*d
+x*d
>=(M-p)*d[M]+x*d[M],即:
x(d
-d[M])>=M*d[M]-N*d
-p*(d[M]-d
)
这样,要使N元钱比M元钱划算,x必须在区间[k1,k2] (k1,k2根据上面的式子得出)
例如上面的例子:
31元比28元划算时有:
(31-28+x)*110>=(28-28+x)*130
即:330+110x>=130x,故x<=16.5
31元比30元划算时有:
330+110x>=240+120x,故x<=9
31元比32元划算时有:
330+110x>=380+95x,故x>=3.33
...
最后所有式子取交集,就得到了x的范围。要求绝对值最小值还不容易吗? :-P
大家注意我在求出了k1,k2后做的最后的处理。可能有一边或两边无界的情况。
正数和负数的处理也有区别。
有一点需要注意:题目没有说输入价位是从小到大排序好的,虽然测试数据都是排序好的。
代码:
分析:
我先来说说题目的意思。就从样例开始分析。
输入是:
31
28 130
30 120
31 110
-1 -1
15
意思就是政府预期价是31元。成本28元,按成本销售的时候可以买130件产品。
每个卖30元的时候可以卖120个,
每个卖31元(输入的最高价位)的时候可以卖110个,
每个卖32元的时候可以卖:110-15=95个。
每个卖33元的时候可以卖:110-15-15=80个。
每个卖34元的时候可以卖:110-15-15-15=65个。
...
因为“相邻价位之间的销量变化是均匀的”,因此28元卖130个,30元卖120个就可以知道
29元卖125个(平均每元减少的销量是(130-120) div (30-28)=5)
输出是4,我们来解释一下为什么是4。
4代表补贴是4元,所以:
在卖28元的时候,总利润是:(28-28+4)*130=520元,
在卖29元的时候,总利润是:(29-28+4)*125=625元,
在卖30元的时候,总利润是:(30-28+4)*120=720元,
在卖31元的时候,总利润是:(31-28+4)*110=770元,
在卖32元的时候,总利润是:(32-28+4)*95=760元,
...
在卖38元的时候,总利润是:(38-28+4)*5=70元,
显然可能的价位就是28~38了。(不能低于成本,卖39的时候销售量就是负数了)
可以看出,现在卖31元最划算,所以人们都愿意卖31元,这样一来不就达到政府的目的了吗!!
而当补贴是0,1,2,3的时候卖31元并不是最划算的,政府的目的达不到,你当然就没有分啦!
题意清楚了吗?好,下面分析思路。
穷举显然可以,但是没有什么意思,留给大家自己写。下面讲我的另外一种算法,数学味道要浓一些,
希望大家坚持看完。
由于需要N元钱最划算,相当于使N元钱的利润大于等于每种价格的利润。因此可以分别考虑。
设补贴为x,则N元钱的利润是:(p为成本)
(N-p+x)*d
=(N-p)*d
+x*d
因此N元钱比M元钱划算的时候有:
(N-p)*d
+x*d
>=(M-p)*d[M]+x*d[M],即:
x(d
-d[M])>=M*d[M]-N*d
-p*(d[M]-d
)
这样,要使N元钱比M元钱划算,x必须在区间[k1,k2] (k1,k2根据上面的式子得出)
例如上面的例子:
31元比28元划算时有:
(31-28+x)*110>=(28-28+x)*130
即:330+110x>=130x,故x<=16.5
31元比30元划算时有:
330+110x>=240+120x,故x<=9
31元比32元划算时有:
330+110x>=380+95x,故x>=3.33
...
最后所有式子取交集,就得到了x的范围。要求绝对值最小值还不容易吗? :-P
大家注意我在求出了k1,k2后做的最后的处理。可能有一边或两边无界的情况。
正数和负数的处理也有区别。
有一点需要注意:题目没有说输入价位是从小到大排序好的,虽然测试数据都是排序好的。
代码:
const m=100; type point=^node; node=record price:longint; sale:longint; next:point; end; var head,tail,p,q:point; pz,sz,pc,sc,si,pi,d,i,k:longint; min,max,v:real; b1,b2,b:longint; begin readln(pz); readln(pc,sc); new(p);head:=p; p^.price:=pc;p^.sale:=sc;p^.next:=nil; readln(pi,si); while pi<>-1 do begin for i:=1 to pi-p^.price do begin new(q); q^.price:=p^.price+1; q^.sale:=p^.sale-(p^.sale-si) div (pi-p^.price) ; if q^.price=pz then sz:=q^.sale; q^.next:=nil; p^.next:=q; p:=q; end; readln(pi,si); end; readln(d);i:=p^.price;si:=p^.sale; while si>d do begin i:=i+1; si:=si-d; new(q); q^.price:=i; q^.sale:=si; if q^.price=pz then sz:=q^.sale; q^.next:=nil; p^.next:=q; p:=q; end; p:=head;max:=-1e20;min:=1e20; while p<>nil do begin if sz>p^.sale then begin v:=((p^.price-pc)*p^.sale-(pz-pc)*sz)/(sz-p^.sale); if v>max then max:=v; end else if sz<p^.sale then begin v:=((p^.price-pc)*p^.sale-(pz-pc)*sz)/(sz-p^.sale); if v<min then min:=v; end; p:=p^.next; end; b1:=trunc(max)-1; while b1<max do b1:=b1+1; b2:=trunc(min)+1; while b2>min do b2:=b2-1; if b1<=b2 then begin if (b1>=0) and (b2>=0) then writeln(b1) else if (b1<0) and (b2<0) then writeln(b2) else writeln(0); end else writeln('NO SOLUTION'); end.
相关文章推荐
- 银行储蓄系统
- leetcode - Sliding Window Maximum
- scss学习笔记
- gcc学习笔记
- 053第484题
- 排序
- codevs1015
- 实例变量可见度及方法、自定义初始化方法、实例化方法、类方法、便利构造器
- 组件名简单改了
- 如何使用DW工具给图片添加热点
- 织梦dedecms同时调用一级分类、二…
- 织梦网站底部的Power by&nbsp…
- dedecms后台验证码显示问题的四种…
- dedecms织梦验证码“图像因其本身有…
- Dedecms当前栏目高亮完美处理办法…
- ecshop伪静态问题
- windows服务器您试图从目录中执行C…
- 远程桌面怎么上传本地资源 磁…
- 如何修改服务器远程密码
- 香港“占中”十问