description
input
第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i + 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。
output
乙個數,n關植物攻擊力的最小總和 ,保留到整數。
sample input
5 23 3
1 110 8
4 82 3
sample output
7 hint
第一關:距離房子3公尺處有乙隻血量3點的殭屍,植物最小攻擊力為1.00000; 第二關:距離房子1公尺處有乙隻血量1點的殭屍、3公尺處有血量3點的殭屍,植物最小攻擊力為1.33333; 第三關:距離房子8公尺處有乙隻血量10點的殭屍、10公尺處有血量1點的殭屍、12公尺處有血量3點的殭屍,植物最小攻擊力為1.25000; 第四關:距離房子8公尺處有乙隻血量4點的殭屍、10公尺處有血量10點的殭屍、12公尺處有血量1點的殭屍、14公尺處有血量3點的殭屍,植物最小攻擊力為1.40000; 第五關:距離房子3公尺處有乙隻血量2點的殭屍、5公尺處有血量4點的殭屍、7公尺處有 血量10點的殭屍、9公尺處有血量1點的殭屍、11公尺處有血量3點的殭屍,植物最小攻擊力 為2.28571。 植物攻擊力的最小總和為7.26905。
對於100%的資料, 1≤n≤10^5,1≤d≤10^12,1≤x≤ 10^12,1≤a≤10^12
source
感人至深…最後我竟然沒發現答案是在凸包上所以可以三分t_t
hta的題解
#include
#include
#include
#include
#include
#define maxn 100010
#define eps 1e-20
using
namespace
std;
int n,top;
double d,ans;
double a[maxn],x[maxn];
struct point
;} friend point operator -(point a,point b) ;}
friend
double
operator *(point a,point b)
}sta[maxn];
double slope(point a,point b)
int main()
;sum+=a[i];
while (top>1&&(now-sta[top-1])*(sta[top]-sta[top-1])>=-eps) top--;
sta[++top]=now;now=(point);
int l=1,r=top,mid1,mid2,len;
while (r-l>=3)
for (int j=l;j<=r;j++) maxn=max(maxn,slope(sta[j],now));ans+=maxn;
}printf("%.0f\n",ans);
}
BZOJ3203 SDOI2013 保護出題人
bzoj luogu 題面不太好簡化就不放了qaq。先對殭屍的血量做乙個字首和,然後在第 i 關中視第 j 只殭屍 j le i 的血量為 a i a 這樣就可以當作是開了穿牆掛,可以一直攻擊每乙隻殭屍直至其死亡。考慮最優策略,一定是某乙隻殭屍在剛好走到門前的時候把他打死。也就是算出打死每乙隻殭屍所...
BZOJ 3203 sdoi 2013 保護出題人
由於樣例解釋很清晰,所以很容易得到以下結論 1 每一關都是獨立的,且殭屍的相對位置不會變 2 每一關的攻擊力 max sum i dis i 其實sum i 是殭屍攻擊力的字首和,dis i 是距離 然後因為輸入是每次在隊頭新增,所以我們可以把字首和轉換成字尾和 攻擊力 max sum i sum ...
SDOI2013 刺客信條
故事發生在1486 年的義大利,ezio 原本只是乙個文藝復興時期的貴族,後來因為家族成員受到聖殿騎士的殺害,決心成為一名刺客。最終,憑藉著他的努力和出眾的天賦,成為了傑出的刺客大師,他不僅是個身手敏捷的武林高手,飛簷走壁擅長各種暗殺術。刺客組織在他的帶領下,為被剝削的平民聲張正義,趕跑了原本統治義...