Luogu P1023 稅收與補貼問題

2022-05-31 06:42:11 字數 4661 閱讀 3343

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

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

你是某家諮詢公司的專案經理,現在你已經知道**對某種商品的預期**,以及在各種價位上的銷售情況。要求你確定**對此商品是應收稅還是補貼的最少金額(也為整數),才能使商家在這樣一種**預期的**上,獲取相對其他價位上的最大總利潤。

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

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

輸入格式:

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

輸出格式:

輸出有兩種情況:若在**預期價上能得到最大總利潤,則輸出乙個單獨的整數,數的正負表示是補貼還是收稅,數的大小表示補貼或收稅的金額最小值。若有多解,取絕對值最小的輸出。

如在**預期價上不能得到最大總利潤,則輸出「no solution」。

輸入樣例#1:

31

28 130

30 120

31 110

-1 -1

15

輸出樣例#1:

4
第一次用cnblogs的latex好激動——

第一次給中文題目寫題意qwq,

題意有點噁心。。。

假設銷售量y是銷售價x的乙個函式

首先,由於「相鄰價位之間銷量的變化是線性的」,所以是這是個分段的一次函式

樣例大概是這樣的

題目就是求當**要求交稅x元或補貼x元時,

以**的期望單價售賣得到的利潤(用式子表示為$=(期望單價-利潤±x)*銷售量)$)大於以其他任何**售賣的利潤

我們設$\ d(i)$表示售價為i的銷量

因為已知相鄰價位之間售價成線性關係

設前乙個讀入單價為l ,當前單價為 r

那麼可得到

$\mbox \frac = \frac $

$\mbox d(k)= (d(r)-d(l))*\frac+d(l)$

於是我們可以計算出對應的d

最**位之後的d,可以直接按照題意求

由題設w為**期望價,f為成本,x為控制量,i為其他某個價位則

那對於其他所有合法的價位滿足

$(w-f+x)*d(w)>=(i-f+x)*d(i)$

$(w-f)*d(w)+x*d(w)>=(i-f)*d(i)+x*d(i)$

$x*d(w)-x*d(i)>=(i-f)*d(i)-(w-f)*d(w)$

$x*(d(w)-d(i))>=(i-f)*d(i)-(w-f)*d(w)$

設$(d(w)-d(i))=b$ 和$(i-f)*d(i)-(w-f)*d(w)=c$

這裡考慮一下b的正負性,

因為 $w<>i$ 那麼不存在$b=0$

若$b>0$,$x>=\frac $

若$b<0$,$x<=\frac $

計算出每個合法價位的關於x的解集

然後解不等式組便可得出結論

我們假設最後解集在$min<=x<=max$

那麼我們

在每次$b>0$時候嘗試找最大的min(就是把解集的左邊界往右縮)

在每次$b<0$時候嘗試找最小的max(就是把解集的右邊界往左縮)

最後我們處理結果

注意!由於結果可能不是整數,直接trunc不行

我們需要對min向上取整,即$\lfloor max\rfloor$

當$min-trunc(min)=0$或$min<0$時,$min=trunc(min)$

當$min>0$時,$min=trunc(min)+1$

注:$min=0$的情況已經包含在第一種裡面啦

我們需要max向下取整,即 $\lceil min \rceil$

當$max-trunc(max)=0$或$max>0$時,$max=trunc(max)$

當$max<0$時,$max=trunc(max)-1$

注:$max=0$的情況已經包含在第一種裡面啦

如果$min>max$ 很明顯無解

如果$(min<=0)and(0<=max)$也就是解集中包含0就可以不收稅也不補貼輸出$0$

否則如果$max<0$就是$min<=max<0$,那麼輸出$max$表示要交稅$|max|$

如果$max>=0$就是$0q1:d為什麼開100000啊?

a1:其實我也不知道——題目也沒給出來,只能看題解啦

q2:泥怎麼不用排序啊?

a2:玄學。。。

1

uses math;

2var

3k,i:longint;

4w,sell,l,r,cb,b,c,cut:longint;

5min1,max1:extended;

6minn,maxx:longint;

78 d:array[1..100000] of

longint;

9t:boolean;

1011

procedure

pr(s:string);

12begin

13writeln(s);

14close(input); close(output);

15halt;

16end;17

18begin

19 // assign(input,'

t.in

'); assign(output,'

t.out');

20reset(input); rewrite(output);

2122

readln(w);

23 l:=0;24

while true do

25begin

26readln(r,sell);

27if r=-1

then

break;

28 d[r]:=sell;

29if l<>0

then

30for k:= l+1

to r-1

do //計算相鄰價位之間的d

31 d[k]:=(d[r]-d[l])*(k-l) div (r-l)+d[l]

32else cb:=r;

33 l:=r;

34end;35

36readln(cut);

37 r:=l+1;//計算高於最**位的d

38while d[r-1]>=0

do39

begin

40 d[r]:=d[r-1]-cut;

41inc(r);

42end

;43 r:=r-1;44

45 min1:=-maxlongint;

46 max1:=maxlongint;

4748

for i:= cb to r do //計算每個合法價位的不等式解

49if (i<>w) and (d[i]>0) then

50begin

51 b:=d[w]-d[i];

52 c:=(i-cb)*d[i]-(w-cb)*d[w];

53if b>0

then min1:=max(c/b,min1)

54else max1:=min(c/b,max1);

55end;56

57 //對min向上取整,對max向下取整

58if (min1-trunc(min1)=0) or (min1<0) then minn:=trunc(min1)

59else minn:=trunc(min1)+1;60

if (max1-trunc(max1)=0) or (max1>0) then maxx:=trunc(max1)

61else maxx:=trunc(max1)-1;62

63if minn>maxx then pr('

no solution');

64if (minn<=0) and (0

<=maxx) then pr('0'

);65

if maxx<0

then writeln(maxx) else

writeln(minn);

6667

close(input); close(output);

68end.

10 23 類模板

類模板實現乙個支援各種型別的陣列 類模板中成員函式建立時機 類模板中成員函式和普通類中成員函式建立時機是有區別的 普通類中的成員函式一開始就可以建立 類模板中的成員函式在呼叫時才建立 所以成員函式類外實現的時候,一般不分開寫 類模板中成員函式建立時機是在呼叫階段,導致分檔案編寫時鏈結不到 解決 解決...

1023 巨人排隊

題目描述 巨人國的小學生放假了,老師要給小朋友們排隊了。可是這個老師有強迫症,一定要路隊上的小朋友按照身高從高到矮排序 也就是排在前面的不能比後面的矮 小朋友呢也很調皮,一旦老師給他排好隊就不願意動了。這個時候小朋友們乙個乙個的從教室裡出來了,每個小朋友一出來老師就要給小朋友安排好位置。請問老師最少...

1023 矩陣翻轉

給定乙個正方形的整數矩陣,輸出將該矩陣按某一方向翻轉後的結果。輸入第一行有乙個整數n,表示一共有n組資料 n不會為負數。之後有n組資料,對於每組資料 第一行有兩個整數a和b,分別表示正方形矩陣的邊長,以及翻轉的方向。當b 0時水平翻轉,當b 1時豎直翻轉,當b 2時以主對角線為軸翻轉。b不會取其他值...