BZOJ 3203 sdoi 2013 保護出題人

2022-05-31 07:48:10 字數 919 閱讀 7274

由於樣例解釋很清晰,所以很容易得到以下結論:

1、每一關都是獨立的,且殭屍的相對位置不會變

2、每一關的攻擊力=max(sum(i)/dis(i))

其實sum(i)是殭屍攻擊力的字首和,dis(i)是距離

然後因為輸入是每次在隊頭新增,所以我們可以把字首和轉換成字尾和

攻擊力=max( (sum_i-sum_j)/(x_i+i*d-j*d) )

這顯然是乙個斜率的式子,又因為殭屍的相對位置不變

所以我們可以維護乙個下凸殼,之後每次在凸殼上三分最優解即可

#include#include#include#include#include#define eps 1e-8

using namespace std;

const int maxn=100010;

int n,top=0,cur;

double d,ans;

double a[maxn],x[maxn];

double sum[maxn];

struct point

};point st[maxn];

typedef point vector;

vector operator -(const point &a,const point &b)

double cross(const point &a,const point &b)

double f(int x)

int main()

double sum=-1e18;

for(int j=l;j<=r;++j)sum=max(sum,f(j));

ans+=sum;

//printf("%.8lf\n",sum);

}printf("%.0lf\n",ans);

return 0;

}

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...

BZOJ3203 SDOI2013 保護出題人

bzoj luogu 題面不太好簡化就不放了qaq。先對殭屍的血量做乙個字首和,然後在第 i 關中視第 j 只殭屍 j le i 的血量為 a i a 這樣就可以當作是開了穿牆掛,可以一直攻擊每乙隻殭屍直至其死亡。考慮最優策略,一定是某乙隻殭屍在剛好走到門前的時候把他打死。也就是算出打死每乙隻殭屍所...

bzoj 3203 保護出題人

題意 在乙個詭異的植物大戰殭屍遊戲中,給出n關 第i關隊首殭屍距房門xi,兩個殭屍之間間隔為d 每次在隊首新增乙個血量為ai的殭屍,其他殭屍不變 每關在門前放乙個攻擊力任意的植物,求n關放置植物總攻擊力的最小值 n 100000,其他資料 10 12 題解 題意敘述略詭異。建議還是去看一眼原題 首先...