霧雨魔理沙_紀中2555_dp


Description

  在幻想鄉,霧雨魔理沙是住在魔法之森普通的黑魔法少女。話說最近魔理沙從香霖堂拿到了升級過后的的迷你八卦爐,她迫不及待地希望試試八卦爐的威力。在一個二維平面上有許多毛玉(一種飛行生物,可以視為點),每個毛玉具有兩個屬性,分值value和倍率mul。八卦爐發射出的魔法炮是一條無限長的直線形區域,可以視為兩條傾斜角為α的平行線之間的區域,平行線之間的距離可以為任意值,如下圖所示:
  
  藍色部分上下兩條長邊之間就是這次八卦爐的攻擊范圍,在藍色范圍內的毛玉(紅點)屬於該此被擊中的毛玉,如果一個毛玉剛好在邊界上也視為被擊中。毛玉擊中以后就會消失,每次發射八卦爐得到分值是該次擊中毛玉的分值和乘上這些毛玉平均的倍率,設該次擊中的毛玉集合為S,則分值計算公式為:
  Score = SUM{value[i] | i 屬於 S} * SUM{mul[i] | i 屬於 S} / |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個實數,表示最大分值,保留三位小數

Hint

[數據范圍]

  對於60%的數據:1 <= N <= 500
  對於100%的數據:1 <= N <= 2,000
  -10,000 <= x,y <= 10,000
  1 <= value,mul <= 100

[注意]

  π = 3.1415926

題解

無力吐槽題目背景:-D
不懂得斜率和三角函數於是悲劇了(>﹏<)

過每個點作與x軸成α°的直線,求得與y軸的交點坐標,相同的點縮成一個作dp就好了

c++和pascal自帶tan()函數,手動提到某位用計算器的同學

代碼

#include <algorithm>
#include <stdio.h>
#include <cmath>
#define p 3.1415926
using namespace std;
struct maoyu
{
double x,y,value,mul;
};
maoyu a[10001],w[10001];
int g[10001],yy[10001];
double d[10001],t;
int cnt=0;
bool cmp(maoyu x,maoyu y)
{
return x.x<y.x;
}
int find(double v)
{
for (int i=1;i<=cnt;i++)
if (abs(w[i].x-v)<=0.00001)
return i;
return 0;
}
int main()
{
int n,arc;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int aa,ab,ac,ad;
scanf("%d%d%d%d",&aa,&ab,&ac,&ad);
a[i]=(maoyu){aa,ab,ac,ad};
}
scanf("%d",&arc);
t=tan((double)(arc)*p/180.0);
for (int i=1;i<=n;i++)
{
double f=a[i].y-a[i].x*t;
int tmp=find(f);
if (tmp)
{
yy[tmp]++;
w[yy[tmp]].value*=a[i].value;
w[yy[tmp]].mul*=a[i].mul;
}
else
{
w[++cnt].x=f;
w[cnt].value=a[i].value;
w[cnt].mul=a[i].mul;
yy[cnt]++;
}
}
sort(w+1,w+cnt+1,cmp);
double ans=0;
for (int i=1;i<=cnt;i++)
{
double val=0,mui=0,st=0;
for (int j=i;j<=cnt;j++)
{
st+=yy[j];
val+=w[j].value;
mui+=w[j].mul;
d[j]=max(d[j],d[i-1]+mui*val/st);
ans=max(d[j],ans);
}
}
printf("%.3f\n",ans);
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com