【模拟】【洛谷普及组】P1023 税收与补贴问题

博客解析了洛谷1023题——税收与补贴问题,指出政府通过补贴或税收调控商品价格。文章抱怨题目描述模糊,并举例说明补贴和税收如何影响市场。关键在于理解价格与消费者购买力的关系,以及如何通过调整策略使目标价格最大化。最后,提出了求解不定式方程组的方法来找到解决方案。

参考博客:税收与补贴问题(洛谷1023)

题解:

我真的没有看懂题目,所以一直卡在这里,我真的哭了,就不能好好地写个题意出来,让大家好懂一点,我要看别人的博客才知道怎么一回事。。。。

首先这个题目的背景就是:政府调控某商品的价格进行操作。

如果政府想某商品控制在一个目标价格(Tar),它只能有 收税和补贴两种形式来调控。

简单举个例子:

譬如,生活用盐,大家在商店都是很便宜的,但其实过程中,是有国家在背后调控的,担心有不良商家涨价来导致百姓生活受到影响。

比如说,生产盐 比如 成本高,但是为了大众的生活需求不能提升价格,这是政府出面 让商家或者生产商 补贴,或者不收税来进行调节,为的就是把定价降下来。

又比如说:大家买手机,国家更加向大家刺激国内需求,想大家支持国产的手机,所以对国外进口的手机进行收税,迫使商家把价格提高,让作为消费者的我们在同一价位上选择使更倾向国内手机,刺激国内生产业。

像这样的例子很多很多。

但是这个和题目有点关联。题目有一个地方说得太含糊了。

就是价格会影响消费者购买力。

即  价格   和  数量 之间的关系,

如果题目给了 某几点 (价格,数量)。

那么两点之间必须均分,换句话说:

价格  28 - 30 有三份,每一份都有对应的数量,

∴价格29的数量 =(价格为28的数量+价格为30的数量)/2

如果没有给定的价格,就按照题目给定的间隔,递减即可。


我们费点精力处理一下 数量和价格,

然后怎么才能让政府达到控制的效果呢????

这样即可:就是目标价格是最大的,比所有定价在这个【补贴|收税】制度下最大值。

(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

 

解不定式方程组即可:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
typedef struct Node {
    int x,y;            // X 指的是价格,Y指的是数量
}Node ;
Node a[N];
bool cmp(Node u,Node v){
    return u.x<v.x;
}
int main()
{
    int Tar,cnt=0,tot;      // Tar 指的是政府想要调控到的目标价格,tot指的是所有情况的个数
    int X,Y,D,Tar_cnt;
    scanf("%d",&Tar);
    while(scanf("%d%d",&X,&Y),(~X||~Y)){
        if( X == Tar ) Tar_cnt = Y;//找到目标价格的数量
        a[cnt].x=X;
        a[cnt++].y=Y;
    }
    scanf("%d",&D);
    sort(a,a+cnt,cmp);      // 题目样例虽然给了顺序的,题目没有提及升序
    tot=cnt;
    for(int i=1;i<cnt;i++){

        int num=(a[i-1].y-a[i].y)/(a[i].x-a[i-1].x);

        if( a[i-1].x + 1 != a[i].x )   {        //把间隔中的情况枚举一下
            for(int j=a[i-1].x+1;j<a[i].x;j++){
                a[tot].x=j;
                a[tot++].y=a[i-1].y-(j-a[i-1].x)*num;

                if( j == Tar ) Tar_cnt = a[i-1].y-(j-a[i-1].x)*num; //找到目标价格的数量
            }
        }
    }

    X=a[cnt-1].x;     //价钱
    Y=a[cnt-1].y;    //数量

    if( Tar >=X )       //把目标后的价格 后枚举一个
    for(int i=X+1; Tar+1>=X&&Y-(i-X)*D>0 ;i++){
        if(i==Tar) Tar_cnt = (Y-(i-X)*D);//找到目标价格的数量
        a[tot].x=i;
        a[tot++].y=(Y-(i-X)*D);
    }
    sort(a,a+tot,cmp);
    int c = a[0].x;  //成本价
    double L = -inf;
    double R =  inf;
    for(int i=0; i < tot ; i++){
        if( a[i].x == Tar ) continue ;
        //解决    Kx >= C 的形式
        double C = (double)((double)(a[i].x-c)*a[i].y - (double)(Tar-c)*Tar_cnt);
        double K = (double)( Tar_cnt-a[i].y );
        if( Tar_cnt > a[i].y ){
            L = max ( C/K, L);
        }else{
            R = min ( C/K, R);
        }
    }
    if(L>R){
        printf("NO SOLUTION\n");
    }else if( L > 0) {
        printf("%.0f\n",ceil(L));
    }else if( R < 0 ){
        printf("%.0f\n",floor(R));
    }else{
        printf("0\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值