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 
#include 
#include 
#include 
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;
}




你可能感兴趣的:(wikioi 1016 税收与补贴 普及组 2000)