算是一周前的一个坑了吧,今天终于填上了。
这,题,真,的,恶,心!写+调也就 1h30min 吧
首先,得先理解题意!!!!!
题意:
先给你一个商品的成本,以成本价为售价的销售量(这个东西在这题里没啥用)。再给你一些同样商品,不同商铺的售价,销售量。你现在想让售价为 $x$ 的商铺盈利最多,那你需要补贴/收税/不补贴也不收税使得这个商铺盈利最多,问你最少的补贴/收税。
大体思路:
- 先找出不收税也不补贴的最大盈利的那个商铺。
- 分类讨论,如果那个商铺的售价比现在想要的那个商铺高,那么就补贴。如果比想要最大盈利的那个商铺低,那么收税,如果相等,说明这个商铺就是我们要找的那个,就直接输出 0。(他不收税也不补贴都是最高的盈利那为什么还要收税/补贴,绝对值肯定大啊,那直接输出!)
一些错误点:(都是我写的时候遇到的错误)
- 找不收税也不补贴的最大盈利,不光要向后搜还要向前搜。
- 查找补贴多少/收税多少时,那个销售量不一定是当前销售量 - $reduce$($reduce$ 就是题目中最高单价外每升高一块钱将减少的销量),他也可能是输入的时候就有的,就是输入的那个销售量两两之间并不是差 $reduce$。
- 还有一些 $double$/$int$ 的问题(?)
这道题最难的就是理解题意,思路什么的很好想,就是题意真的....恶心
然后代码的话 压 了 一 点 点 小 行(雾
代码:
#include<bits/stdc++.h>
using namespace std;
int wants,cnt1=-1,k=0,maxn = -1,pos;
double incosts,cnt;//成本,物品个数
int x[10000009],y[10000009];//售价,物品个数
double profit[10000009],reduce;//利润 | 每升高一块钱将减少的销量
int check[10000009],cc[10000009];
int main(){
cin >> wants >> incosts >> cnt;
for(int i=1; ; i++){
cin >> x[i] >> y[i];
k++;
if(x[i] == y[i] && x[i] == -1){ k--; break; }
if(x[i] == wants) cnt1 = y[i];
profit[k] = (x[k]-incosts)*y[k];
if(profit[k] > maxn){ maxn = profit[k]; pos = x[k]; }
check[x[i]] = 1;
cc[x[i]] = y[i];
}
cin >> reduce;
if(cnt1 == -1) cnt1 = y[k]-(wants-x[k])*reduce;
//找出不收税也不补贴时的最大盈利
for(int i=1; ; i++){
int tmpx = (x[k]+i),tmpy = (y[k]-i*reduce);
if(tmpx < 0 || tmpy < 0)break;
else{
x[k+1] = tmpx;
y[k+1] = tmpy;
if((tmpx-incosts)*tmpy > maxn){ maxn = (tmpx-incosts)*tmpy; pos = tmpx; }
}
}
for(int i=1; ; i++){//往前也要搜
int tmpx = (x[k]-i),tmpy = (y[k]+i*reduce);
if(tmpx < 0)break;
else{
x[k+1] = tmpx;
y[k+1] = tmpy;
if((tmpx-incosts)*tmpy >= maxn){ maxn = (tmpx-incosts)*tmpy; pos = tmpx; }
}
}
if(maxn == (wants-incosts)*cnt1){ printf("0"); return 0; }//不收税也不补贴
if(pos > wants){//需要补贴
for(int i=1; ; i++){//补贴i元
int q,nowpro,nexts;
if(check[wants-1] == 1)q = (wants-1-incosts+i)*(cc[wants-1]);
else q = (wants-1-incosts+i)*(cnt1+reduce);
nowpro = (wants-incosts+i)*cnt1;
if(check[wants+1] == 1)nexts = (wants+1-incosts+i)*(cc[wants+1]);
else nexts = (wants+1-incosts+i)*(cnt1-reduce);
if(nowpro > nexts && nowpro > q){ cout << i; return 0; }
}
}
else{//需要收税
for(int i=1; ; i++){//收税i元
int q,nowpro,nexts;
if(check[wants-1] == 1)q = (wants-1-incosts-i)*(cc[wants-1]);
else q = (wants-1-incosts-i)*(cnt1+reduce);
nowpro = (wants-incosts-i)*cnt1;
if(check[wants+1] == 1)nexts = (wants+1-incosts-i)*(cc[wants+1]);
else nexts = (wants+1-incosts-i)*(cnt1-reduce);
if(nowpro >= nexts && nowpro >= q){ cout <<'-'<< i; return 0; }
}
}
printf("NO SOLUTION");
return 0;
}
PS: