wikioi 1016 税收与补贴 普及组 2000

http://wikioi.com/problem/1016/

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

 

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

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

 也就是要是补贴或税收后使得预期价的利润最大(其他价格都小于预期价格)

并且我们要注意计算每个价位的销量


样例解释:
在卖28元的时候,总利润是:(28-28+4)*130=520元,
在卖29元的时候,总利润是:(29-28+4)*125=625元,
在卖30元的时候,总利润是:(30-28+4)*120=720元,
在卖31元的时候,总利润是:(31-28+4)*110=770元,
在卖32元的时候,总利润是:(32-28+4)*95=760元,
...
在卖38元的时候,总利润是:(38-28+4)*5=70元,

include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int now;
struct goods{
    int p;
    int n;
}g[10000];//记录利润和销量
int x, n, cost;
void add(int a, int b)
 {
    g[now].p = (a);
    g[now].n = (b);
    now++;
}
void init()
{
    int i;
    int a, b;
    int c, d;
    int k, f;
    scanf("%d", &x);
    scanf("%d%d", &a, &b);
    cost = a;
    x -= cost;//每个都减少成本价
    while(scanf("%d%d", &c, &d)==2&&(c != -1 || d != -1))
	{
        k = (d - b) / (c - a);//计算线性
        f = d - c * k;//利润
        for(i = a; i <= c - 1; i++)
	{
            add(i - cost, k * i + f);//计算中间价格
        }
        a = c, b = d;
    }
    scanf("%d", &k);
    for(i = a; (b - (i - a) * k) > 0; i++)
	{
        add(i - cost, (b - (i - a) * k));//最高价后的价格
    	}
}

int main()
{
    int i, j;
    int a, b, k;
    double up = -100000, down = 1000000;
    init();
    for(i = 0; i < now; i++)
	{
        if(g[i].p == x)
	{
            n = g[i].n;
            break;
        }
    }
    for(i = 0; i < now; i++)
	{
        k = 1;//符号
        a = g[i].p * g[i].n - n * x;
        b = n - g[i].n;
        if(b < 0)
	{
            k = -1;
        }
        if(b != 0)//更新
	{        
            if(k == 1)
		{
                up = max(up, (double)a / b);
            }
            else
            {
                down = min(down, (double)a / b);
            }
        }
    }
    if(up <= down)
    {
        if(up > 0)
        {
            printf("%d\n", (int)ceil(up));
        }
        else
        {
            down = fabs(down);
            printf("%d\n", - (int)ceil(down));
        }
    }
    else//不可能
    {
        printf("NO SOLUTION\n");
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值