由於樣例解釋很清晰,所以很容易得到以下結論:
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-8using 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 題解 題意敘述略詭異。建議還是去看一眼原題 首先...