竞赛笔记竞赛C++2024-03-25竞赛笔记Minecraft-Sep2024-03-252024-03-252024/3/25 1234567891011121314151617181920212223242526272829303132#include<bits/stdc++.h>#define MAX (100000+100)using namespace std;int x,r,m,n,p,d[MAX];//x政府期望价格,r成本double Min=-1e9,Max=1e9;//记录答案的可能范围 int main(){ cin>>x>>m>>n; r=m;//成本价格记录到r while (m!=-1&&n!=-1)//循环知道输入的m和n都是-1 { d[m]=n;//当前价格点存储到d[m] for(int i=p+1;i<m;i++)//线性插值计算为提供的价格点的销量 d[i]=d[i-1]+(n-d[p])/(m-p);//基于上一个和当前的价格点,计算中间点 p=m;//更新 cin>>m>>n; } cin>>m; while(d[p]>m)//继续计算价格高于最高定价的销量 p++,d[p]=d[p-1]-m;//递减规则地推 for(int i=r;i<=p;i++)//遍历全部价格点 { double ans=(d[x]*(x-r)-d[i]*(i-r))*1.0/(d[i]-d[x]);//计算需要的税收、补贴金额 double g=d[i]-d[x]; if(g>0) Max=min(Max,ans);//正数为补贴 else Min=max(Min,ans);//否则为税收 } if(Min>0) cout<<(int)ceil(Min); else if(Max<0) cout<<(int)floor(Max); else puts("0"); return 0;}