题目链接:该题是luogu试炼场的2-2:T1
试炼场2-2题解包:
题目大意:
1 某政府给了一个指导价x,要求在这个指导价下进行销售,必须达到“总利润”最大;
2 问:某政府需要在这个指导价下,收税还是给补贴,才能实现“总利润最大”,要求绝对值尽量小;
解题思路:
题目是不是简单?但是看不懂说什么鬼!读了两天的题目,再看了一堆题解,才搞清楚,题目到底是说啥:
1 题目给出该商品的价量表的一部分 ,要求你补全这个价量表:其实是给出一个分段的等差数列,要求各段按照对应的公差完成整个“价格-销量”表的填写工作,用于后面的枚举;
2 要求你算出“最大总利润”,是否出现在“指导价x”上;
3 在算售价的时候,注意“ZF主导”的功能:
可能性1:单品:利润=售价-成本+补贴
可能性2: 单品:利润=售价-成本-税收
4 题目要求“ZF主导功能”的绝对值尽可能小,所以从1开始枚举补贴,从-1开始枚举税收;
5 到这里还是感觉头晕的同学,请结合代码思考:
上代码:
//luogu123:税收与补贴问题
//1.设相邻价位间销量的变化是线性;
//2.在价格高于给定的最高价位后,销量以某固定数值递减
//3.从补贴的角度:枚举售价与销量的关系
#include<cstdio>
int a[100005];//a[i]表示价格为 i时候的销量
int n=1,ans,s,tr;
int st,ed;//成本,最高价
void pre()//读入与准备:价量关系表
{
scanf("%d",&tr);//目标售价
int x,y,d;
scanf("%d %d",&x,&y);
st=ed=x;//当前价格
a[x]=y;//成本时销量
while(1)
{
scanf("%d %d",&x,&y); if(x==-1&&y==-1) break;
if(x-ed>1)//与上次输入数字不相邻
{
d=(a[ed]-y)/(x-ed);//算出等差
for(int i=ed+1;i<=x;i++) a[i]=a[i-1]-d;//补间
}
else//相邻递增
{
a[x]=y;
}
ed=x;
}
scanf("%d",&d);//最高后的等差
while(1)//补齐最高价量关系
{
if(a[ed]-d<=0) break;
a[ed+1]=a[ed]-d;
ed++;
}
}
bool bu()//计算补贴与税收的问题
{
int su=-9999999,ans=0;
for(int k=1;k<=100000;k++)//k为正/负:补贴/税收
{
//补贴
for(int i=st+1;i<=ed;i++)
{
int x=(i-st+k)*a[i];//当前总利润:补贴
if(x>=su)
{
su=x; ans=i;
}
}
if(ans==tr) { printf("%d",k); return 1; }//最大值就是目标价
//税收
su=-9999999;ans=0;
for(int i=st+1;i<=ed;i++)
{
int x=(i-st-k)*a[i];//当前总利润:收税
if(x>=su)
{
su=x; ans=i;
}
}
if(ans==tr) { printf("%d",-k); return 1; }//最大值就是目标价
}
}
int main()
{
pre();//数据准备:从st->ed 的价量关系表已经做好
// for(int i=st;i<=ed;i++) printf("%d %d\n",i,a[i]); //测试价量关系表
if(!bu()) printf("NO SOLUTION");//补贴测试
}