ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷 P1023税收与补贴题解--zhengjun

2022-06-10 19:10:27  阅读:317  来源: 互联网

标签:maxx 洛谷 -- 题解 价位 minx chengben yuqijia 输入


题目背景

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

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

题目描述

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

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

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

输入格式

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

输出格式

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

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

输入输出样例

输入 #1 复制
31
28 130
30 120
31 110
-1  -1
15
输出 #1 复制
4

说明/提示

所有数字均小于\(100000\)

思路

首先,这道题的题目实在有点难理解,以样例为例,先体会一下。

  1. 输入预期价31
  2. 输入成本和销售量28 130
  3. 输入30 120
  4. 补全29 125
  5. 输入31 110
  6. 补全30 117
  7. 输入-1 -1
  8. 输入15
  9. 接着补全32 9533 80以此类推

这样你就有一张全价位的表了。
接着,因为要在预期价上得到最大的利润,所以,在其他任何价位上的利润都不能超过它。
设当前来到了 \(i\) 元的价位上,政府要补贴 \(x\) 元(如果 \(x\) 为负,则是收税)
就可以列出方程

(i-chengben+x)*c[i]≤(yuqijia-chengben+x)*c[yuqijia]

然后,用一个代数式表示 \(x\) :

\(x=\dfrac {(i-chengben)\times c_i-(yuqijia-chengben)\times c_{yuqijia}}{c_{yuqijia}-c_i}\)

或者

\(x=\dfrac {(yuqijia-chengben)\times c_{yuqijia}-(i-chengben)\times c_i}{c_i-c_{yuqijia}}\)
最后,只要枚举 \(i\) ,更新 \(maxx\) 和 \(minx\) ,再根据 \(maxx\) 和 \(minx\) 输出

代码

#include<bits/stdc++.h>
#define maxn 100039
using namespace std;
int yuqijia,chengben,x,y,p,c[maxn];
double minx=-1e9,maxx=1e9;
int main()
{
    cin>>yuqijia>>x>>y;
	chengben=x;
    while(x!=-1&&y!=-1)
    {
        c[x]=y;
        if(x!=chengben)
        for(int i=p+1;i<=x-1;i++)
            c[i]=c[i-1]+(c[x]-c[p])/(x-p);
        p=x;
        cin>>x>>y;
    }
	cin>>x;
    while(c[p]>x){
        p++;
		c[p]=c[p-1]-x;
	}
    for(int i=chengben;i<=p;i++)
    {
    	if(i==yuqijia)continue;
        double ans=double(c[yuqijia]*(yuqijia-chengben)-c[i]*(i-chengben))/(c[i]-c[yuqijia]);
        //套公式
        if(c[i]>c[yuqijia])maxx=min(maxx,ans);
        else minx=max(minx,ans);
    }
    if(minx>0)
		printf("%d",(int)ceil(minx));
    else if(maxx<0)
	    printf("%d",(int)floor(maxx));
    else if(minx<=maxx)
		printf("0");
	else
	    printf("NO SOLUTION");
    return 0;
}

谢谢--zhengjun

标签:maxx,洛谷,--,题解,价位,minx,chengben,yuqijia,输入
来源: https://www.cnblogs.com/A-zjzj/p/16364355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有