luogu1023:税收与补贴问题:理解价量关系与枚举

题目链接:该题是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

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");//补贴测试 
} 

 

你可能感兴趣的:(题解,luogu,大礼包,题表,luogu,试炼场)