P1023 税收与补贴问题
P1023 税收与补贴问题
题解
对于这道题目其实只关乎3个价位的利润:
expect-1 expect expect+1
一旦利润: expect-1 ≤ expect ≥ expect+1
那么在这种情况下的税收和补贴就可以实现要求
解释一下为啥>=和,<=
题目说:
这样一开始按这样算的:利润: expect-1 < expect > expect+1
但是最后一个测试点并不允许我这样QWQ,是我理解问题QWQ
解释一下,比如3个数 a=5 , b=5 , c=1
最大值是5
a既然等于5,那么a就是相对最大值啊
再者,题面说的是“在这个价格上能取到最大总利润”
最大值本来就可以大于等于
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<cstdlib> #include<queue> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int expt,cb,maxval,maxcnt,jia,prinum=0; int lv,ln,ev,en,rv,rn; bool flag=0; struct node { int val,cnt; }pri[100010]; void work(int x) { int k1=ln*(lv-cb+x); int k2=en*(ev-cb+x); int k3=rn*(rv-cb+x); if(k1<=k2&&k2>=k3) flag=1; } int main() { expt=read(); pri[++prinum].val =read(); pri[prinum].cnt =read(); maxval=cb=pri[prinum].val ; maxcnt=pri[prinum].cnt; int x,y; while(scanf("%d%d",&x,&y)) { if(x==-1&&y==-1) break; pri[++prinum].val =x; pri[prinum].cnt =y; if(x>maxval) { maxval=x; maxcnt=y; } if(x==expt) ev=x,en=y; if(x==expt-1) lv=x,ln=y; if(x==expt+1) rv=x,rn=y; } jia=read(); if(!lv) lv=expt-1,ln=maxcnt-jia*(lv-maxval); if(!ev) ev=expt,en=maxcnt-jia*(ev-maxval); if(!rv) rv=expt+1,rn=maxcnt-jia*(rv-maxval); for(int i=1;i<=expt;i++) { work(i); if(flag){ printf("%d\n",i); return 0; } work(-i); if(flag){ printf("%d\n",-i); return 0; } } printf("NO SOLUTION\n"); return 0; }