税收与补贴问题————NOIP2000年提高组

一句话概括题意:求最大总利润。

思路:暴力枚举!!!!!!!

首先我们有三种不同的选择,然后预处理好

st[i]=j;表示的是某个单位的单价现在售出了多少东西

然后将三种情况一一枚举即可。

#include<cstdio>
#include<cstring>
using namespace std;
int st[100005],ans=0;
int last,next,ad,d,n,yuqijia,bas,maxx,a,b,c;
int main()
{
    scanf("%d",&yuqijia);
    int p,q;
    scanf("%d%d",&p,&q);//取一个值来作为标准
    st[p]=q;
    maxx=p;
    while(scanf("%d%d",&a,&b)!=EOF)//读入的操作,st[i]=b,表示的是某价位的单价现在销售出了b部
    {
        if(a==-1&&b==-1) break;
        st[a]=b;
        maxx=max(maxx,a);//取最大值
    }
    scanf("%d",&ad);
    if(st[yuqijia]==0)
    {
        if(maxx<yuqijia)//如果预期值比原来给的值还要大
        {
            st[yuqijia]=st[maxx]-(yuqijia-maxx)*ad;//那么就将当前预期值弄出一个价位
            maxx=yuqijia;
        }
        if(yuqijia<maxx)
        {
            st[yuqijia]=st[maxx]+(maxx-yuqijia)*ad;//换顺序
        }
    }
    next=yuqijia+1;
    last=yuqijia-1;//取上一个和下一个并且慢慢养生
    if(st[last]==0)//每升高一块钱你就加上当前的销量
    {
        st[last]=st[yuqijia]+ad;
    }
    if(st[next]==0)//每减少一块钱你就减掉当前的销量
    {
        st[next]=st[yuqijia]-ad;
    }
    int x=st[yuqijia],y=st[last],z=st[next];//x是预期值的销量,以此类推。
    while(a<b||a<c)
    {
        a=(yuqijia-bas)*x;
        b=(last-bas)*y;
        c=(next-bas)*z;
        if(b>a)
        {
            ans--;
            yuqijia--;last--;next--;
        }
        else if(c>a)
        {
            ans++;
            yuqijia++;last++;next++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

BY ZZJ

猜你喜欢

转载自blog.csdn.net/qq_43002849/article/details/86637177