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

本文介绍了一种利用数学方法解决经济决策问题的具体案例。通过解析题目给出的条件和要求,推导出了确定政府对该商品征收或补贴的最小金额的公式,以确保商家在政府预期价格下获得最大总利润。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

单位商品利润=单位商品价格 - 单位商品成本 (- 税金 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.
### 关于洛谷 P1746 离开中山路的 Python 解题思路 对于编号为P1746的题目《离开中山路》,该问题属于图论中的最短路径求解类问题。给定地图上的多个节点以及连接这些节点的道路长度,目标是从起点到终点找到一条总距离最小的路径[^1]。 #### 数据结构的选择 为了高效处理此类问题,可以采用邻接表来表示输入的地图数据。邻接表不仅节省空间而且便于快速访问相连边的信息。此外,在寻找最短路径过程中,优先队列(通常通过堆实现)能够帮助按照当前累计成本从小到大顺序遍历各个顶点[^2]。 #### Dijkstra算法的应用 针对本题特点——即不存在负权边的情况,Dijkstra算法是一个合适的选择。此方法从源结点出发逐步扩展已知区域直至覆盖整个网络;每次从未被收录进来的候选集中挑选具有最低估计代价者作为新的探索中心,并更新其相邻未访问过的邻居们的临时标记值直到抵达目的地为止[^3]。 下面是具体的Python代码实现: ```python import heapq def dijkstra(n, edges, start, end): graph = [[] for _ in range(n)] # 构建加权无向图的邻接列表形式 for u, v, w in edges: graph[u].append((v, w)) graph[v].append((u, w)) dist = [float('inf')] * n # 初始化所有节点的距离为无穷大 prev = [-1] * n # 记录前驱用于重建路径 pq = [(0, start)] # 将起始位置加入优先级队列并设初始距离为零 dist[start] = 0 while pq: d, node = heapq.heappop(pq) if node == end: # 提早终止条件:当到达终点时停止搜索 break if d > dist[node]: # 跳过已经找到了更优解的情形 continue for neighbor, weight in graph[node]: new_dist = d + weight if new_dist < dist[neighbor]: dist[neighbor] = new_dist prev[neighbor] = node heapq.heappush(pq, (new_dist, neighbor)) path = [] curr = end while curr != -1: path.append(curr) curr = prev[curr] return list(reversed(path)), dist[end] if __name__ == "__main__": N = ... # 输入城市数量N M = ... # 道路条数M roads = [...] # 所有道路信息[(A_i,B_i,C_i)...] S, T = ..., ... # 出发点S和目的地点T result_path, min_distance = dijkstra(N, roads, S-1, T-1) # 注意索引调整 print(f"The shortest distance is {min_distance}.") print("The optimal route:", " -> ".join(map(str,[i+1 for i in result_path]))) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值