NOIP2011模擬9 7 霧雨魔理沙

2021-07-16 16:09:40 字數 3363 閱讀 6440

description

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

藍色部分上下兩條長邊之間就是這次八卦爐的攻擊範圍,在藍色範圍內的毛玉(紅點)屬於該此被擊中的毛玉,如果乙個毛玉剛好在邊界上也視為被擊中。毛玉擊中以後就會消失,每次發射八卦爐得到分值是該次擊中毛玉的分值和乘上這些毛玉平均的倍率,設該次擊中的毛玉集合為s,則分值計算公式為:

score = sum * sum / |s|

其中|s|表示s的元素個數。魔理沙將會使用若干次八卦爐,直到把所有毛玉全部擊中。任意兩次攻擊的範圍均不重疊。最後得到的分值為每次攻擊分值之和。現在請你計算出能夠得到的最大分值。

input

第1行:1個整數n,表示毛玉個數

第2..n+1行:每行四個整數x, y, value, mul,表示星星的座標(x,y),以及value和mul

第n+2行:1個整數α,表示傾斜角角度,0°到180°

output

第1行:1個實數,表示最大分值,保留三位小數

sample input

3 1 3 3 1

2 1 2 2

3 4 2 1

45sample output

9.333

data constraint

hint

【資料範圍】

對於60%的資料:1 <= n <= 500

對於100%的資料:1 <= n <= 2,000

-10,000 <= x,y <= 10,000

1 <= value,mul <= 100

【注意】

π = 3.1415926

題目大意topic effect

平面上有若干個帶權點,用傾斜角為α的直線將其分為若干部分,每部分可以得到乙個分值,求乙個最大得分。

考察演算法algorithm:

解析幾何 動態規劃

analysis

首先,要對於α為0或90°的情況進行特判,分別按照y座標或x座標排序,然後進行dp

我們可以設乙個f陣列,設f[i]表示前i個毛玉所獲得的最大貢獻。

於是dp方程便顯而易見:f[

i]=m

axf[

j]+∑

valu

e[k]

(j<

k<=i)

∗∑mu

l[k]

(j<

k<=i)

i−j

要注意:如果兩個點進行排序的座標相同,則這兩個點始終是屬於同乙個區域的,不能分開。在列舉時需要特判。

有了上面那個思想,我們可以看出,當斜率為任意值時,仍然可以對當前節點進行排序。

我們計算過每個點的斜角為α的直線與y軸的交點,並按照這個交點的y座標b進行排序。

為了大家方便,我就直接透露公式了 o((>ω< ))o

b=y-k*x;

(因為y=kx+b ,當x=0時,函式相交於y軸,即y=b) a[

i].b

=−an

gle∗

a[i]

.x+a

[i].

y;而 an

gle=

tan(

angl

e∗pi

/180);

這條式子是怎麼來的呢

由於我懶得畫圖,所以讀者先腦補一下 o(╯□╰)o

設:直線與x軸的交點為(a,0) 根據t

an=y

x−a

所以可以轉成 a=

tan∗

x−yt

an a

=x−y

tan

與y軸的類似。

之後直接dp即可。

時間複雜度為o(

n2)

ps:這道題涉及到三角函式.

在這裡給大家稍微普及一下三角函式蛤。。。

設∠a為α。 si

n(α)

=ac

cos(

α)=b

c ta

n(α)

=ab

#include 

#include

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define fd(i,a,b) for (int i=a;i>=b;i--)

#define n 2005

#define pi 3.1415926

#define inf 2147483647

using

namespace

std;

int n;

struct note

a[n];

struct record

pre[n];

int b[n];

double angle;

double f[n];

bool cmp(note a,note b)

while(ch>='0'&&ch<='9')

return x*w;

}double calc(int l,int r)

int main()

fo(i,1,n)

fo(i,1,n) f[i] = -inf;

f[0]=0;

fo(i,1,n)

fo(j,0,i-1)

if (a[i].x == a[j].x && a[i].y == a[j].y) break;

else f[i] = max(f[i],f[j] + calc(j+1,i));

printf("%.3lf",f[n]);

}

NOIP2011模擬考試總結

這兩天的考了noip2011的6道題,600分的題大致得了420分左右。a了day1的t1,t2,day2的t1。這次模擬我感覺沒有發揮到自己的飽和水平,犯了非常傻比的錯。day1的第三題讀豎列時,題目說了以零結尾,我還手賤寫了個y 7,這樣如果這一列是滿的話,最後乙個0會被下一列讀進去。把y 7刪...

NOIP2011 模擬 鋪地毯

題目描述 description 為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域 可看做是平面直角座標系的第一象限 鋪上一些矩形地毯。一共有n 張地毯,編號從1 到n。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知...

NOIP2011模擬11 1 釣魚

我們把釣魚的過程放在座標系裡來考慮。圖中藍色的點為船,初始時它的座標記為 ax,y 河深為y,河寬為x。某個時刻會從左邊界或右邊界遊出來一條魚 左邊的往右邊遊,右邊的往左邊遊 即魚游出來時的橫座標為0或x,這條魚每秒會游d個單位長度,魚的長度為l。初始時刻為0,對於每個時刻x,船可以選擇花費1s向左...