2024-03-25竞赛笔记

2024/3/25

pF4IWu9.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}