zoukankan      html  css  js  c++  java
  • 洛谷——P1023 税收与补贴问题

    题目描述

    你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
    
    总利润=单位商品利润*销量
    
    单位商品利润=单位商品价格 - 单位商品成本 (- 税金 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.
  • 相关阅读:
    生活重心
    做自己才对,想多只会徒增烦恼
    列下计划,一个个实现吧
    公司搬迁
    限制文件的类型
    总结
    mvc mvp mvvm区别
    sessionStorage
    localStorage点击次数存储
    2016.09.01 html5兼容
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319518.html
Copyright © 2011-2022 走看看