【問題描述】
為了掩護大部隊,英雄lucky被敵人包圍在某山頭。但他有足夠的彈藥,憑藉自己的勇敢,完全可以將湧上來的敵人乙個乙個乾掉。lucky是個神槍手,只要他的槍膛中有子彈,他就能將在他射程m(用從敵人位置到山頭的直線距離算)以內的乙個敵人瞬間射殺。但如果在射程內沒有敵人,出於節約子彈考慮,lucky會等待敵人靠近然後射擊。
正當lucky為自己的強大而自我膨脹時,他忽然發現了乙個致命的失誤:他攜帶的槍是單發槍,每射出一發子彈都必須花k秒鐘的時間裝子彈。而**的敵人才不會花時間等你換子彈呢。他們始終在以1m/s的速度接近山頭。而如果在乙個敵人到達山頭時lucky無法將他擊斃,那麼我們可憐的lucky就將犧牲在敵人的刺刀下。現在lucky向你發出求助:要保住自己的性命並且殲滅所有敵人,lucky最多只能用多少時間給槍裝上一發子彈?
說明:假設一開始lucky的槍中就有一發子彈,並且一旦確定乙個裝彈時間,lucky始終會用這個時間完成子彈的裝卸。希望你能幫助lucky脫離險境。
【輸入格式】
第一行有兩個整數n和m,n代表敵人個數,m代表lucky的射程。接下來有n行,每行乙個整數di,代表每個敵人一開始相對山頭的距離(單位為公尺)。
【輸出格式】
僅有乙個整數,代表lucky的換彈時間(單位為秒)。
【輸入樣例】
6 100
236120
120120
120120
【輸出樣例】
25【資料範圍】
50%的資料有:2<=n<=1000
100%的資料有:2<=n<=100,000; 1<=m<=10,000,000;1<=di<=10,000,000
解題思路:根據題意,要求最小換彈時間最大,主要演算法肯定是求最小值最大問題的二分猜答案,對於每猜乙個換彈時間,如果可行,則可以換彈時間再猜大點,如果不可行,換彈時間就要猜小點。這道題的難點在於如何判斷猜的換彈時間是否可行,我們可以用乙個變數tmp來記錄當前lucky所用的時間,先將敵人按相對山頭的距離由小到大排序,然後從第二個敵人開始列舉(第乙個敵人只要進入射程,就可以直接被射殺),先計算tmp,如果tmp大於該敵人到山頭的時間,則答案不可行,否則就看下乙個敵人。
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=100005;
int n,m;
int d[maxn];
bool check(int m) //判斷猜的換彈時間是否可行
if(d[i]-tmp>m) //如果換彈後敵人仍未進入射程,則可以在敵人進入射程之前換彈
i++;
} if(ok==1) return 1;
return 0;
}int main()
printf("%d\n",ans);
return 0;
}
1878 旋轉數字
中文english 我們稱x為好數當整個數字繞平面內任一點旋轉180 之後仍是其本身,例如 1 2 0 12021 69 96 特別要注意的是,我們使用的數字跟我們在紅綠燈上使用的是一樣的。給你長度n,我們需要統計長度為n的好數有多少個。輸入 n 1 輸出 5 說明 5 個好數為 0 1 2 5 8...
BSOJ 3800 染色 貪心
3800 四校聯考1 染色 description 人人生而平等,然而後來人們逐漸選擇了不同的道路,人與人之間,變得不再平等。你可能會因為染上惡人之色而墮落,成為社會的敗類 你也可能因為染上善人之色,而在逆境中不斷成長。但是,紅與黑並非絕對的。所謂 近朱者赤,近墨者黑 你能改變周遭的環境,那麼周遭的...
BSOJ 4852 比賽 暴力優化
4852 模擬試題 比賽 description 有兩個隊伍a和b,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由a中的乙個選手與b中的乙個選手對抗。同乙個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如a隊有a1和a2兩個人,b隊有b1和b2兩個人,那麼 a1 vs b...