洛谷p1023

#include<iostream>
#include<cstdio>
#include<algorithm>
int x,x1,a[10001],b[10001],change,t=1,i,j,s,flag1,flag2,n1,n2,flag;
int mscore(int a,int b)
{
    return a>b;
}
using namespace std;
int main()
{
    scanf("%d%d%d",&x,&a[0],&b[0]);//输入预期价,以及成本、成本销量
    while(a[t-1]!=-1)//输入
    {
    scanf("%d%d",&a[t],&b[t]);
    t++;
    }
    t--;
    sort(a,a+t);//把价格销量进行排序,因为价格越高销量越小,所以两个数组排序顺序相反,则价格销量可以互相匹配
    sort(b,b+t,mscore);
    scanf("%d",&change);//输入变化量
    s=t;
    for(i=1;i<t;i++)
    if(a[i]-a[i-1]>1)
    for(j=a[i-1]+1;j<a[i];j++)//因为相邻价格之间销量呈线性增长,则用一个循环把在输入范围内所有的价格销量的可能性都存储在数组里
    {
        a[s]=j;
        b[s]=b[i-1]-(b[i-1]-b[i])/(a[i]-a[i-1])*(j-a[i-1]);
        s++;
    }
    sort(a,a+s);
    sort(b,b+s,mscore);//再次排序
    for(i=1;i<s;i++)//找到市场预期价
    if(a[i]==x)
    {
        x1=b[i];
        flag=1;
    }
    if(flag==0)//如果没有找到,则市场预期价大于输入价格的最大值
    x1=b[s-1]-(x-a[s-1])*change;
    for(i=0;;i++)//精髓循环,i表示补贴或者收税
    {
        flag1=0;//标记
        flag2=0;
        n1=(x-a[0]+i)*x1;
        n2=(x-a[0]-i)*x1;//记录对于补贴或者收税之后市场预期价带来的总利润
        for(j=1;;j++)
        {
            if(j>=s)//如果价格超过了原有的范围,则不断+change
            {
            b[j]=b[j-1]-change;
            a[j]=a[j-1]+1;            
            }
            if(b[j]<=0)break;//当销量低于等于0时,进入下一个i循环
            if(n1<(a[j]-a[0]+i)*b[j])flag1=1;//如果利润低于收税或补贴后的利润,做标记
            if(n2<(a[j]-a[0]-i)*b[j]||n2<=0)flag2=1;//如果收税之后利润小于零,抛弃    
        }
        if(flag1==0&&flag2==1)break;
        else if(flag1==1&&flag2==0)break;
        else if(flag1==0&&flag2==0)break;    //这些情况说明找到了你需要的i
        else if(i==b[0]*10){flag1=-2;break;}//我也不知道范围是多少,反正成本i=销量*10够大了,洛谷数据能过
    }
    if(flag1==1&&flag2==0)printf("-%d",i);
    else if(flag1==0&&flag2==1)printf("%d",i);
    else if(flag1==0&&flag2==0)printf("%d",i);
    else if(flag1==-2)printf("NO SOLUTION");//输出(o゜▽゜)o☆[BINGO!]
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值