首页 > 其他分享 >[2000年NOIP普及组] 税收与补贴问题

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

时间:2022-08-14 19:12:08浏览次数:82  
标签:普及 NOIP int max price zero 2000 num expect

[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;

}

标签:普及,NOIP,int,max,price,zero,2000,num,expect
From: https://www.cnblogs.com/xdzxyingrui/p/16586074.html

相关文章

  • [2000年NOIP普及组] 税收与补贴问题
     价格枚举范围,只要销量不为0就一直枚举。因销量有两个区间,故枚举时要注意。该题要注意,最小值在绝对值中产生,要注意输出结果有正有负。    ......
  • P1190 [NOIP2010 普及组] 接水问题(嵌套循环——贪心算法)
    学校里有一个水房,水房里一共装有mm个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为11。现在有nn名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺......
  • [2016年NOIP普及组] 回文日期
    部分正确  没考虑月份日期的合法性正确   ......
  • [2000年NOIP普及组] 税收与补贴问题(样例解析)
    开始。首先,我们用题目给的样例数据,做成如下的数据表。既不补贴,也不加税。  可见这时商家卖33元是利润最大的,400元。下面,我们动用税和补贴,最终要使得商家卖31元的时候利......
  • [2011年NOIP提高组] 铺地毯
    [2011年NOIP提高组]铺地毯分析:根据题意,用for循环n张地毯,用if语句判断题目给出的点是否在地毯范围内(地毯左下角的坐标到加上地毯长度后的坐标就是整个地毯的范围),如果在su......
  • [2001年NOIP普及组] 最大公约数和最小公倍数问题
    输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数条件:1.P,A是正整数2.要求P,Q以x0为最大公约数,以y0为最小公倍数.试求:满足条件的所有可......
  • [2001年NOIP普及组] 最大公约数和最小公倍数问题
    [2001年NOIP普及组]最大公约数和最小公倍数问题分析:根据题意,求最大公约数和最小公倍数,其中有一个点是两数乘积等于两数的最大公约数乘最小公倍数。知道这一点后,用for循......
  • [NOIP2001 提高组] 一元三次方程求解
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ doublea,b,c,d,x1,x2,x3; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); for(doublei=-100;i<=100;i+=0.001)//枚举每个......
  • P1008 [NOIP1998 普及组] 三连击
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ for(inta=123,b,c;a<=329;a++) { b=2*a;c=3*a; if((a%10)*(a/10%10)*(a/100)*(b%10)*(b/10%10)*(b/100)*(c%1......
  • [2011年NOIP提高组] 铺地毯
    首先想到用二维数组,但是内存太大会爆;因为题目说的是最上面的那块地毯,所以暗示我们应该用for循环倒着推,又给了我们每个地毯的大小和位置,那我们直接从后看这块地毯包不包含(x,......