您的位置:首页 > 其它

H-FZU2203-单纵大法好

2015-10-13 10:39 351 查看
<span style="font-size:18px;">题目链接:<a target=_blank href="http://acm.fzu.edu.cn/problem.php?pid=2203" target="_blank">FZU2203</a></span>
贪心加二分法。
<pre name="code" class="cpp">#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int len, num, size,m;
int place[200005],bomb[200005];
//放x个炸弹能否被炸到
bool judge(int x){
for (int i = 1; i <= x; i++)
bomb[i] = place[i];
sort(bomb + 1, bomb + x + 1);
bomb[0] = 0, bomb[x + 1] = len + 1;
int cnt = 0;
for (int i = 0; i <= x; i++)
cnt += (bomb[i + 1] - bomb[i]) / (size + 1);
if (cnt >= num)return true;
else return false;
}
int main(){
while (scanf("%d %d %d", &len,&num, &size) != EOF){
scanf("%d", &m);
for (int i = 1; i <= m; i++)
scanf("%d", &place[i]);
int r = m, l = 1, mid, ans = 0;  //ans要初始化!!!!
if (judge(m))
printf("-1\n");
else{
while (l <= r){
mid = (l + r) >> 1;
if (judge(mid)){
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
printf("%d\n", ans + 1);
}
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: