题意详细解释
由于不同的价格对应不同的k,但是恒k<0
大致图像:
只是不同点价格对应斜率不一样,但一个a一定对应一个mmax使得总利润最大
所以我们只要找到一个a的范围使得预期价比两边都大就可以了
输入成本和成本对应销量 pre=成本 while (输入不是结束条件){ 差分=(现价销量-上个价格销量)/(现价-上个价格) for (){ 把每个价格的销量填补上 } } 把预期价的左右一个价格解不等式组: Min=1.0*((n+1-cost)*s[n+1]-(n-cost)*s[n])/(s[n]-s[n+1]); Max=1.0*((n-cost)*s[n]-(n-1-cost)*s[n-1])/(s[n-1]-s[n]); if (最大值和最小值异号){ 0是最小值 }else 不异号{ 输出绝对值最小的 }
#include <bits/stdc++.h> using namespace std; int n,cost,sale,pre,c,m,d; double Max,Min; int s[10005]; int main(int argc, char** argv) { cin>>n>>cost>>sale; pre=cost; s[cost]=sale; while(scanf("%d%d",&c,&m),c!=-1&&m!=-1){ int d=(m-s[pre])/(c-pre); for(int i=pre+1;i<=c;i++){ s[i]=s[i-1]+d; } pre=c; } cin>>d; for(pre++;s[pre-1]-d>0;pre++){ s[pre]=s[pre-1]-d; } Min=1.0*((n+1-cost)*s[n+1]-(n-cost)*s[n])/(s[n]-s[n+1]); Max=1.0*((n-cost)*s[n]-(n-1-cost)*s[n-1])/(s[n-1]-s[n]); if(Min*Max<0){ cout<<0; }else{ if(fabs(Min)>fabs(Max)) cout<<floor(Max); else cout<<ceil(Min); } return 0; }