#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;
}
洛谷p1023
最新推荐文章于 2022-01-18 09:49:37 发布