洛谷——P1023 稅收與補貼問題

P1023 稅收與補貼問題

 

題目背景

每樣商品的價格越低,其銷量就會相應增大。現已知某種商品的成本及其在若干價位上的銷量(產品不會低於成本銷售),並假設相鄰價位間銷量的變化是線性的且在價格高於給定的最高價位後,銷量以某固定數值遞減。(咱們假設價格及銷售量都是整數)ios

對於某些特殊商品,不可能徹底由市場去調節其價格。這時候就須要政府以稅收或補貼的方式來控制。(所謂稅收或補貼就是對於每一個產品收取或給予生產廠家固定金額的貨幣)spa

題目描述

你是某家諮詢公司的項目經理,如今你已經知道政府對某種商品的預期價格,以及在各類價位上的銷售狀況。要求你肯定政府對此商品是應收稅仍是補貼的最少金額(也爲整數),才能使商家在這樣一種政府預期的價格上,獲取相對其餘價位上的最大總利潤。code

總利潤=單位商品利潤*銷量blog

單位商品利潤=單位商品價格 - 單位商品成本 (- 稅金 or + 補貼)get

輸入輸出格式

輸入格式:string

 

輸入的第一行爲政府對某種商品的預期價,第二行有兩個整數,第一個整數爲商品成本,第二個整數爲以成本價銷售時的銷售量,如下若干行每行都有兩個整數,第一個爲某價位時的單價,第二個爲此時的銷量,以一行-1,-1表示全部已知價位及對應的銷量輸入完畢,輸入的最後一行爲一個單獨的整數表示在已知的最高單價外每升高一塊錢將減小的銷量。產品

 

輸出格式:it

 

輸出有兩種狀況:若在政府預期價上能獲得最大總利潤,則輸出一個單獨的整數,數的正負表示是補貼仍是收稅,數的大小表示補貼或收稅的金額最小值。如有多解,取絕對值最小的輸出。io

如在政府預期價上不能獲得最大總利潤,則輸出「NO SOLUTION」。class

 

輸入輸出樣例

輸入樣例#1:  複製
31
28 130
30 120
31 110
-1  -1
15
輸出樣例#1:  複製
4

 

參考題解:https://www.luogu.org/problemnew/solution/P1023

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 10001
using namespace std;
int i,j,s,t,x,x1,n1,n2,flag,flag1,flag2,a[N],b[N],change;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int cmp(int a,int b)
{return a>b;}
int main()
{
    x=read();a[0]=read(),b[0]=read();
    while(1)
    {
        ++t;
        a[t]=read(),b[t]=read();
        if(a[t]==-1&&b[t]==-1) break;    
    }
    //--t;
    sort(a,a+t);sort(b,b+t,cmp);
    change=read();s=t;
    for(i=1;i<t;i++)
     if(a[i]-a[i-1]>1)
      for(j=a[i-1]+1;j<a[i];j++)
      {
          a[s]=j;
          b[s]=b[i-1]-(b[i-1]-b[i])/(a[i]-a[i-1])*(j-a[i-1]);
          s++;
      }
      sort(a,a+s);sort(b,b+s,cmp);
      for(i=1;i<s;i++)
       if(a[i]==x)
           x1=b[i],flag=true;
    if(!flag) x1=b[s-1]-(x-a[s-1])*change;
    for(i=0;;i++)
    {
        flag1=0,flag2=0;
        n1=(x-a[0]+i)*x1;
        n2=(x-a[0]-i)*x1;
        for(j=1;;j++)
        {
            if(j>=s)
            {
                b[j]=b[j-1]-change;
                a[j]=a[j-1]+1;
            }
            if(b[j]<=0) break;
            if(n1<(a[j]-a[0]+i)*b[j]) flag1=1;
            if(n2<(a[j]-a[0]-i)*b[j]||n2<=0) flag2=1;
        }
        if(flag1==0&&flag2==1) break;
        else if(flag1==1&&flag2==0) break;
        else if(flag1==0&&flag2==0) break;
        else if(i==b[0]*10)
        {
            flag1=-2;
            break;
        }
    }
    if(flag1==1&&flag2==0) printf("-%d",i);
    else if(flag1==0&&flag2==1) printf("%d",i);
    else if(flag1==0&&flag2==0) printf("%d",i);
    else if(flag1==-2) printf("NO SOLUTION");
    return 0;
}
相關文章
相關標籤/搜索