P1023 税收与补贴问题

两盒软妹~` 提交于 2020-02-04 21:26:34

题目背景
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)

对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)

题目描述
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。

总利润=单位商品利润 \times× 销量

单位商品利润=单位商品价格 - 单位商品成本 (- 税金 or + 补贴)

输入格式
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1−1,-1−1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。

输出格式
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。

如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”。

输入输出样例
输入 #1复制
31
28 130
30 120
31 110
-1 -1
15
输出 #1复制
4
说明/提示
所有数字均小于100000

思路是看题解才会的,然后只过了一个点,下载了测试数据,发现max没有初始化,第四个点还是不过,最后发现max比较时加等号就对了

还是不够熟练,练的不够,debug之后经常忘记注释掉

#include <bits/stdc++.h>
using namespace std;
int main()
{
//	freopen("D:\\LYJ.txt","r",stdin);
	int price,a,b,i=1,v[100010][2];
	cin>>price>>v[0][0]>>v[0][1];
	int temp,max;
	while(1)
	{
		cin>>a>>b;
		if(-1==a&&-1==b) break; 
		if(a-v[i-1][0]>1)
		{
			temp=(v[i-1][1]-b)/(a-v[i-1][0]);
			for(int j=v[i-1][0]+1;j<a;j++)//未给出的自己写上 
			{
				v[i][0]=j;
				v[i][1]=v[i-1][1]-temp;
				i++;
			}
		}
		max=i;
		v[i][0]=a;
		v[i][1]=b;
		i++;
	}
	cin>>b;
	for(i=max+1;v[i-1][1]-b>0;i++)//i不能再重新int了 
	{
		v[i][0]=v[i-1][0]+1;
		v[i][1]=v[i-1][1]-b;
	}
//	for(int l=0;l<i;l++) {cout<<v[l][0]<<" "<<v[l][1]<<endl;}
	
	
	
	//之前debug的代码写错,一直以为写错了 
	//b temp max没用了,max存最大利润b存此时的价格 
	b=0;
	a=1;
	while(abs(a)<100000)// a 补贴/税从+-1开始 
	{
		//补贴 
		max=-99999;//max每次都要初始化 
		for(int l=1;l<i;l++)//遍历判断最大值 
		{
			temp=(v[l][0]-v[0][0]+a)*v[l][1];
			//最后debug出来是少写了a,复制的时候都不看就复制上去了 
			if(max<=temp)//不加=第四个测试点会WA,还是看题解的评论才改出来的 
			{
				max=temp;
				b=v[l][0];
			}
		}
		if(b==price)
		{
			cout<<a;
			return 0;
		}
		a=-a;//税
		max=-99999;//max每次都要初始化 
		for(int l=1;l<i;l++)//遍历判断最大值 
		{
			temp=(v[l][0]-v[0][0]+a)*v[l][1];
			if(max<=temp)
			{
				max=temp;
				b=v[l][0];
			}
		}
		if(b==price)
		{
			cout<<a;
//			cout<<" "<<max;
			return 0;
		}
		a=(-a)+1;
	}
	cout<<"NO SOLUTION";//有大佬证明出来没有这种情况 
	return 0;
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!