霧雨魔理沙

2021-07-16 23:52:28 字數 2043 閱讀 5092

本題是本人在做比賽是時發現的一道挺有趣的題目,一開始,可真是讓我們一頭霧水。

題目大意如下:

在二維平面直角座標系中,給出你若干個點,然後讓你用乙個與x軸為alpha(應該是這樣打),但寬度可以為無限大的平行四邊形的區間,去覆蓋這些點(原題是毛玉),每個點有它的分數和倍率,得分為分數值*倍數值/點數,求最大收益。如圖:

乍一看,一臉懵。後來聽到了曹大神的神奇方法,發現可以把每個點做一條直線,該線與x軸之間的角度為alpha度。求完後就是dp找乙個區間來求出最大分值。我們知道y=xk+b這個神奇的東西,那麼,求出k和b就能解決問題了。假設落在x軸上的點為(y』,0),原來的點的座標(x,y)。k用正切函式tan可以求出來k=tan(alpha*n/180).b套公式求出,剩下直接dp。

**:

uses math;

var i,j,n:longint;

ap:longint; k:real;

b,f:array[1..2000]of real;

x,y,v,m:array[0..2000]of longint;

qz,qz1:array[1..2000]of longint;

procedure

qsort

(l,r:longint);

//對於斜率進行排序

var i,j,t1:longint; mid,tt:real; t:longint;

begin

i:=l; j:=r;

mid:=b[(i+j) div

2]; repeat

while b[i]do inc(i);

while b[j]>mid do dec(j);

if i<=j then

begin

tt:=b[i];

b[i]:=b[j];

b[j]:=tt;

t:=x[i];

x[i]:=y[j];

x[j]:=t;

t:=y[i];

y[i]:=y[j];

y[j]:=t;

t:=v[i];

v[i]:=v[j];

v[j]:=t;

t:=m[i];

m[i]:=m[j];

m[j]:=t;

inc(i); dec(j);

end;

until i>j;

if ithen qsort(i,r);

if j>l then qsort(l,j);

end;

procedure

work;

begin

for i:=1

to n do readln(x[i],y[i],v[i],m[i]);

readln(ap);

k:=tan(ap*3.1415926/180); //用正切函式求k

for i:=1

to n do

begin

b[i]:=y[i]-k*x[i]; //求出每個點的b

end;

qsort(1,n);

qz[1]:=v[1];

qz1[1]:=m[1];

for i:=2

to n do

begin

qz[i]:=qz[i-1]+v[i];

qz1[i]:=qz1[i-1]+m[i];

end;

for i:=1

to n do

begin

for j:=1

to i do

f[i]:=max(f[i],f[j-1]+(qz[i]-qz[j-1])*(qz1[i]-qz1[j-1])/(i-j+1))

end;

writeln(f[n]:0:3)

end;

begin

readln(n);

work;

end.

**如上,謝謝觀賞!

NOIP2011模擬9 7 霧雨魔理沙

description 在幻想鄉,霧雨魔理沙是住在魔法之森普通的黑魔法少女。話說最近魔理沙從香霖堂拿到了公升級過後的的迷你八卦爐,她迫不及待地希望試試八卦爐的威力。在乙個二維平面上有許多毛玉 一種飛行生物,可以視為點 每個毛玉具有兩個屬性,分值value和倍率mul。八卦爐發射出的魔法炮是一條無限長...