題目描述
你是某家咨詢公司的項目經理,現在你已經知道政府對某種商品的預期價格,以及在各種價位上的銷售情況。要求你確定政府對此商品是應收稅還是補貼的最少金額(也為整數),才能使商家在這樣一種政府預期的價格上,獲取相對其他價位上的最大總利潤??偫麧?單位商品利潤*銷量單位商品利潤=單位商品價格 - 單位商品成本 (- 稅金 or + 補貼)輸入格式:
輸入的第一行為政府對某種商品的預期價,第二行有兩個整數,第一個整數為商品成本,第二個整數為以成本價銷售時的銷售量,以下若干行每行都有兩個整數,第一個為某價位時的單價,第二個為此時的銷量,以一行-1,-1表示所有已知價位及對應的銷量輸入完畢,輸入的最后一行為一個單獨的整數表示在已知的最高單價外每升高一塊錢將減少的銷量。輸出格式:
輸出有兩種情況:若在政府預期價上能得到最大總利潤,則輸出一個單獨的整數,數的正負表示是補貼還是收稅,數的大小表示補貼或收稅的金額最小值。若有多解,取絕對值最小的輸出。如在政府預期價上不能得到最大總利潤,則輸出“NO SOLUTION”。題解:
不得不說一句:“差點題目都沒看懂!!”草稿打了半天(看了下題解),才明白是道數學題。以樣例為例,設未知數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,然后根據min和max的正負號來決定輸出哪個。代碼:
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.新聞熱點
疑難解答