[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