2021.06.02税收和补贴问题

本文探讨了如何在税收和补贴政策影响下,最大化商品在特定价格区间内的利润。通过实例解析和算法实现,揭示了政府干预如何调整市场价格,以及如何计算补贴或税收的最优化数额。

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

2021.06.02税收和补贴问题

(题目来源:洛谷-P1023)

题目描述

每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)

对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)

输入格式

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

输出格式

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

样例输入

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

样例输出

4

数据规模和约定

思路

1.初看本题,不解题意。
2.当不解题意时,一定要用excel模拟样例!

??????????????????????

可见,政府补贴会使价格下降。

代码

    class Solution{ 
        static int cost = 0;
        void test() { //m售价	s销量	c控制
            Scanner cin = new Scanner(System.in);
            //如遇到题目难以理解,用excel进行模拟!!
            int tar = cin.nextInt(); int ds = 0;
            ArrayList<Temp> lis = new ArrayList<Temp>();
            Temp head = new Temp(cin.nextInt(), cin.nextInt()); lis.add(head);
            cost = head.money;
            while(true) {
                int m = cin.nextInt();
                int s = cin.nextInt();
                if(m == -1 && s == -1) break;
                lis.add(new Temp(m,s));
            }
            int dec = cin.nextInt(); //超过后销量的下降值
            
            while(true) { //如果目标值大于当前最大值
                Temp cur = lis.get(lis.size()-1);
                if(cur.money >= tar) break;
                lis.add(new Temp(cur.money+1,cur.sales-dec));
            }
            
            int c = 0; //政府的干预值
            while(true) {
                int max = 0, maxInd = 0;
                for(int i = 0; i < lis.size(); i++) {
                    lis.get(i).setCon(c);
                    if(max < lis.get(i).getY()) {
                        max = lis.get(i).getY();
                        maxInd = i;
                    }
                }
                //找到了最大利润的坐标
                if(maxInd == lis.size()-1) { //如果位于右边界
                    Temp cur = lis.get(lis.size()-1);
                    Temp nt = new Temp(cur.money+1, cur.sales-dec);
                    nt.setCon(c);
                    lis.add(nt);
                    continue;
                } else { //如果位于左边界
                    
                }
                if(lis.get(maxInd).money == tar) { //如果已是期望的价格
                    System.out.println(c);
                    return;
                } else { //政府补贴导致价格下降, 政府收税导致价格上升
                    if(lis.get(maxInd).money > tar) c++;
                    else c--;
                }
            }
            
        }
    }
    class Temp{
        int money, sales;
        int con;
        void setCon(int c) {
            con = c;
        }
        public Temp(int money, int sales) {
            super();
            this.money = money;
            this.sales = sales;
        }
        int getY() {
            return (money+con-Solution.cost)*sales;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值