題目描述
你是某家咨詢公司的項(xiàng)目經(jīng)理,現(xiàn)在你已經(jīng)知道政府對(duì)某種商品的預(yù)期價(jià)格,以及在各種價(jià)位上的銷售情況。要求你確定政府對(duì)此商品是應(yīng)收稅還是補(bǔ)貼的最少金額(也為整數(shù)),才能使商家在這樣一種政府預(yù)期的價(jià)格上,獲取相對(duì)其他價(jià)位上的最大總利潤(rùn)。總利潤(rùn)=單位商品利潤(rùn)*銷量單位商品利潤(rùn)=單位商品價(jià)格 - 單位商品成本 (- 稅金 or + 補(bǔ)貼)輸入格式:
輸入的第一行為政府對(duì)某種商品的預(yù)期價(jià),第二行有兩個(gè)整數(shù),第一個(gè)整數(shù)為商品成本,第二個(gè)整數(shù)為以成本價(jià)銷售時(shí)的銷售量,以下若干行每行都有兩個(gè)整數(shù),第一個(gè)為某價(jià)位時(shí)的單價(jià),第二個(gè)為此時(shí)的銷量,以一行-1,-1表示所有已知價(jià)位及對(duì)應(yīng)的銷量輸入完畢,輸入的最后一行為一個(gè)單獨(dú)的整數(shù)表示在已知的最高單價(jià)外每升高一塊錢將減少的銷量。輸出格式:
輸出有兩種情況:若在政府預(yù)期價(jià)上能得到最大總利潤(rùn),則輸出一個(gè)單獨(dú)的整數(shù),數(shù)的正負(fù)表示是補(bǔ)貼還是收稅,數(shù)的大小表示補(bǔ)貼或收稅的金額最小值。若有多解,取絕對(duì)值最小的輸出。如在政府預(yù)期價(jià)上不能得到最大總利潤(rùn),則輸出“NO SOLUTION”。題解:
不得不說一句:“差點(diǎn)題目都沒看懂!!”草稿打了半天(看了下題解),才明白是道數(shù)學(xué)題。以樣例為例,設(shè)未知數(shù)x,我們要求 (31-28+x)*110>=(28-28+x)*130 (31-28+x)*110>=(29-28+x)*125 (31-28+x)*110>=(30-28+x)*120 (31-28+x)*110>=(32-28+x)*95這樣便可以解出x的范圍,min<=x<=max,然后根據(jù)min和max的正負(fù)號(hào)來決定輸出哪個(gè)。代碼:
var d:array [0..10001] of longint; x,y:array [0..501] of longint; n,m,nm,r,l:longint; min,max:real;PRocedure init;var o,p,i,j:longint;begin readln(n); nm:=0; readln(o,p); while (o<>-1) and (p<>-1) do begin inc(nm); x[nm]:=o; y[nm]:=p; readln(o,p); end; readln(m); r:=x[1]; l:=x[nm]+y[nm] div m; if (n<r) and (n>l) then begin writeln('NO SOLUTION'); halt; end; for i:=1 to nm-1 do begin o:=(y[i]-y[i+1]) div (x[i+1]-x[i]); for j:=x[i] to x[i+1]-1 do d[j]:=y[i]-o*(j-x[i]); end; for i:=x[nm] to l do d[i]:=y[nm]-m*(i-x[nm]);end;procedure main;var i,o,t:longint;begin min:=maxlongint; max:=-maxlongint; for i:=r to l do begin o:=d[n]-d[i]; t:=i*d[i]-n*d[n]-r*(d[i]-d[n]); if (o>0) and (t/o>max) then max:=t/o; if (o<0) and (t/o<min) then min:=t/o; end; if max<-maxlongint then x[0]:=-maxlongint else if (max>0) and (max-trunc(max)>0) then x[0]:=trunc(max)+1 else x[0]:=trunc(max); if min>maxlongint then y[0]:=maxlongint else if (min<0)and (trunc(min)-min>0) then y[0]:=trunc(min)-1 else y[0]:=trunc(min); if (x[0]<0) and (y[0]>0) then begin x[0]:=0; y[0]:=0; end; if x[0]>y[0] then writeln('NO SOLUTION') else if abs(x[0])<abs(y[0]) then writeln(x[0]) else writeln(y[0]);end;begin init; main; end.
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注