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

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

思路:先开一个二维数组,将商品在各个价位的销售量以表格的方式记录下来,再加上补贴或税收,得出最大利润与期望的比较,最后输出

代码如下:

#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--;//如果不连续,后退一个,在那加上缺着的

                 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--;//因为前面每次都先i++,所以最后多一次,需要抵消

      cin>>down;

      zero=a[i][2];//开始推各个价位的销量

      while(zero>0)//扩充最大价格后的部分    {

      {  if(zero-down<0) break; //销售量<=0就结束

           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:09  shanyingrui  阅读(202)  评论(0编辑  收藏  举报