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;
}

 

posted @ 2019-07-26 20:34  晔子  阅读(329)  评论(0编辑  收藏  举报