P1023 税收与补贴问题
这一题我选了一篇好的题解 做法是解不等式 (遇到的第一道解不等式的题,原来一开始要定义解集为无穷)
解析请看注释
#include<bits/stdc++.h>//第一次碰到解不等式的题
using namespace std;
const int maxn = 10005;//数据最大值不超过一万
int expect,cost,c,it,scale,sale[maxn];// 政府期望价 成本价(增加) 成本价(不变)工作指针(初始值为0 指向价格) 临时销量 sale数组是不同价格对应的销量
double MIN = -1e9,MAX = 1e9;//程序解不等式先默认解集为一切实数 这里是(-1e9 - 1e9)
int main(){
cin>>expect>>cost>>scale;
c = cost;
while(cost != -1 && scale != -1){//这里第一次循环虽然算出了从0到成本的单价对应的销量 但是这些数据是无用的 因为单价 要确保大于成本
sale[cost] = scale;
for(int i = it + 1;i < cost;i++)
sale[i] = sale[i - 1] + (scale - sale[it]) / (cost - it);
it = cost;
cin>>cost>>scale;
}
cin>>cost;//最后输入的cost性质从商品单价变成了在已知的最高单价外每升高一块钱将减少的销量
while(sale[it] > cost){//工作指针指向的价格对应的销量在减去cost后仍然大于0 即 sale[it + 1]的销量大于0
it++;
sale[it] = sale[it - 1] - cost;
}//到这一步就算出了每一个价格所对应的销量 (确保销量大于等于成本c 不然无意义) 而且这里的it指向了最高单价
for(int i = c;i <= it;i++){
double ans = (sale[expect] * (expect - c) - sale[i] * (i - c)) * 1.0 / (sale[i] - sale[expect]);//浮点数除法一定要乘上1.0啊!!!!!
//这里的ans就是所求补贴或者税收
//等式来自于 不等式 : (ans + i - c) * sale[i] <= (ans + expect - c) * sale[expect];
double flag = sale[i] - sale[expect];//判断分母的正负 确认不等式符号
if(flag > 0)MAX = min(MAX,ans);//解集上限判断
else MIN = max(MIN,ans);//解集下限判断
}
if(MIN > 0)printf("%d",(int)ceil(MIN));//向上取整(ceil)
else if(MAX < 0)printf("%d",(int)floor(MAX));//向下取整(floor)
else cout<<'0';//MIN < 0 < MAX
return 0;
}
本文介绍了解不等式求解税收与补贴问题的方法,通过定义解集为实数范围,逐步计算不同价格下的销量,并最终确定补贴或税收的合理区间。使用C++实现,涉及销量预测、成本分析及数学运算。

664

被折叠的 条评论
为什么被折叠?



