[2000年NOIP普及组] 税收与补贴问题

[2000年NOIP普及组] 税收与补贴问题

  • 分析:根据题意,在销量随售价改变的基础上求最小的补贴或税收,本题用了打表的方式来展现售价与销量之间的关系,其中出现了几个与普遍的规律不相同的组合,对于特例我们就要进行单独考虑,在打完表后,根据利润=(售价-进价+补贴)*销量 或者 利润=(售价-进价-税收)*销量 并开一个max来求其中的利润最大值以此获得此时的j(补贴或税收)值,如果此时的价格刚好是政府所期望的就说明找到了。
  • #include<iostream>
    using namespace std;
    int main()
    {
    int a[100001][3];//前面是指第几个 后面1指价格 2指数量
    int i=1,expect,cha,temp,down,zero,max,num,price,p;
    cin>>expect;
    while(cin>>a[i][1]>>a[i][2]&&a[i][1]!=-1&&a[i][2]!=-1)
    {
    i++;
    if(i>2&&a[i-1][1]-a[i-2][1]>1)//两个数量之间差值大于一(特例)
    {
    i--;//i退回前一位去处理特例
    cha=(a[i-1][2]-a[i][2])/(a[i][1]-a[i-1][1]);//特例每平均数的差值
    temp=a[i][1];//记录差值
    for(int j=a[i-1][1]+1;j<=temp;j++)
    {
    a[i][1]=j;//每一个数是当前的价格数
    a[i][2]=a[i-1][2]-cha;//i的数量是前一个的数量减去差值
    i++;
    }
    }
    }
    i--;//到-1-1停的,所以来个i--抵消一下
    cin>>down;
    zero=a[i][2];//赋值给zero推各价位数量
    while(zero>0)
    {
    if(zero-down<0) break;//数量成负的了
    else
    {
    zero-=down;//每次降价都减少的数量
    i++;//否则i就继续加
    a[i][1]=a[i-1][1]+1;//此时价格等于前一位+1
    a[i][2]=zero;//将此时数量赋值
    }
    }
    for(int j=1;j<=10000;j++)//补助
    {
    max=-99999;
    for(int k=1;k<=i;k++)//相当于i
    {
    num=(a[k][1]-a[1][1]+j)*a[k][2];//利润=(售价-进价+补贴)*数量
    if(num>=max)//求最大值
    {
    max=num;
    price=a[k][1];//现在的价格
    p=1;//此时j为正
    }
    }
    if(price==expect)
    {
    cout<<j*p<<endl;//若此时价格等于期望值符合题意
    return 0;//找到就退出
    }
    max=-99999;
    for(int k=1;k<=i;k++)//相当于i
    {
    num=(a[k][1]-a[1][1]-j)*a[k][2];//利润=(售价-进价-税收)*数量
    if(num>=max)//求最大值
    {
    max=num;
    price=a[k][1];//现在的价格
    p=-1;//此时j为负
    }
    }
    if(price==expect)
    {
    cout<<j*p<<endl;//若此时价格等于期望值符合题意
    return 0;//找到就退出
    }
    }
    cout<<"NO SOLUTION"<<endl;
    return 0;
    }

posted @ 2022-08-14 19:57  4lovls  阅读(198)  评论(0)    收藏  举报