• 洛谷1023 税收与补贴问题 解题报告


    洛谷1023 税收与补贴问题

    本题地址: http://www.luogu.org/problem/show?pid=1023

    题目背景

      每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)   对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:

    31
    28 130
    30 120
    31 110
    -1  -1
    15

    输出样例#1:

    4

    题解

    模拟+穷举

    笔者用的是穷举,枚举到以下这两种情况就可停了:

    if (价格-成本+补贴(即当前价格的利润)>预期价格的利润)and(当前价格的销量>预期的) then exit(补贴);{因为随着补贴的增加,两者的利润只会相差得更远}

    if (价格-成本-税收(即当前价格的利润)>预期价格的利润)and(当前价格的销量<预期的) then exit(税收);{因为随着税收的增加,两者的利润只会相差得更远}

    即输出'NO SOLUTION'。

    还要注意边界问题,最重要的是细心!

    下面附上代码。

    代码

    1. const m=100;  
    2. type point=^node;  
    3. node=record  
    4. price:longint;  
    5. sale:longint;  
    6. next:point;  
    7. end;  
    8. var head,tail,p,q:point;  
    9. pz,sz,pc,sc,si,pi,d,i,k:longint;  
    10. min,max,v:real;  
    11. b1,b2,b:longint;  
    12. begin  
    13. readln(pz);  
    14. readln(pc,sc);  
    15. new(p);head:=p;  
    16. p^.price:=pc;p^.sale:=sc;p^.next:=nil;  
    17. readln(pi,si);  
    18. while pi<>-do begin  
    19. for i:=to pi-p^.price do begin  
    20. new(q);  
    21. q^.price:=p^.price+1;  
    22. q^.sale:=p^.sale-(p^.sale-si) div (pi-p^.price) ;  
    23. if q^.price=pz then sz:=q^.sale;  
    24. q^.next:=nil;  
    25. p^.next:=q;  
    26. p:=q;  
    27. end;  
    28. readln(pi,si);  
    29. end;  
    30. readln(d);i:=p^.price;si:=p^.sale;  
    31. while si>d do begin  
    32. i:=i+1;  
    33. si:=si-d;  
    34. new(q);  
    35. q^.price:=i;  
    36. q^.sale:=si;  
    37. if q^.price=pz then sz:=q^.sale;  
    38. q^.next:=nil;  
    39. p^.next:=q;  
    40. p:=q;  
    41. end;  
    42. p:=head;max:=-1e20;min:=1e20;  
    43. while p<>nil do begin  
    44. if sz>p^.sale then begin  
    45. v:=((p^.price-pc)*p^.sale-(pz-pc)*sz)/(sz-p^.sale);  
    46. if v>max then max:=v;  
    47. end  
    48. else if sz<p^.sale then begin  
    49. v:=((p^.price-pc)*p^.sale-(pz-pc)*sz)/(sz-p^.sale);  
    50. if v<min then min:=v;  
    51. end;  
    52. p:=p^.next;  
    53. end;  
    54. b1:=trunc(max)-1;  
    55. while b1<max do b1:=b1+1;  
    56. b2:=trunc(min)+1;  
    57. while b2>min do b2:=b2-1;  
    58. if b1<=b2 then begin  
    59. if (b1>=0) and (b2>=0) then writeln(b1)  
    60. else if (b1<0) and (b2<0) then writeln(b2)  
    61. else writeln(0);  
    62. end  
    63. else writeln('NO SOLUTION');  
    64. end.

    (本文系笔者原创,未经允许不得转载)

    博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10
  • 相关阅读:
    SQL语句-用sql语句得到表中所有字段的名字
    SQL语句-判断数据库中是否有这张表
    Java开发-创建第一个项目hello world
    MFC-一个很简单的程序最小化到托盘,带右键菜单带图标
    Everything SDK-基于名称快速定位文件和文件夹。
    NX二次开发-基于PycharmIDE的NXOpen Python开发环境配置
    手动局域网搭建FTP服务器
    FreeCAD二次开发-基于控制台模式FC外部开发
    FreeCAD二次开发-基于PyQT对话框与FC交互的开发
    实例开发-NX二次开发手动截图工具
  • 原文地址:https://www.cnblogs.com/yzm10/p/4750510.html
Copyright © 2020-2023  润新知