poj3258

来源:互联网 发布:ubuntu 安装apache 编辑:程序博客网 时间:2024/05/01 05:24

题目较难。题目大致题意为母牛要过河,起始位置为0,终止位置为L,中间有n个石头,在可以移开最多m(0<=m<=n)块石头的情况下,求最大的(石块间的最小距离)。

题目与poj3273相似。可对照poj3273结题报告分析,分析如下:

选定一个数x,按照任意石头之间距离不小于(即>=)x的原则分组(结合贪心算法分组),求得最小石头移开数。

1)若最小石头移开数大于m,则说明该数大了,要减小。

2)若最小石头移开数小于等于m,则说明满足题意。那么我们就求以求出这些数中最大的x

而x的范围为0——L,且f(x)单调递增,f(x)表示对于给定的最小间隔,最小石头移开数。故可以利用二分查找法求得满足f(x)<=m的最大x。

下面是程序: 328K+94MS

#include <stdio.h>#include <stdlib.h>#include <algorithm>#define Max 50010 // 最大个数using namespace std;int record[Max]; // 记录石头的位置int L,n,m;int main(){scanf("%d%d%d",&L,&n,&m);record[0]=0; // 起始位置为0record[n+1]=L; // 结束位置为Lfor(int i=1;i<=n;i++) // 输入石头位置scanf("%d",&record[i]);sort(record+1,record+1+n); //对石头位置进行升序排序int left=0,right=L,mid; //0<=x<=L,二分法求解满足最少石头移开数f(x)<=m的最大x值while(left<=right){mid=(left+right)>>1;int ans=0,Sum,Count=0;
                   // ans,Sum,Count依次表示从哪个石头开始检查、第i个石头与第ans个石头之间的距离、移开石头个数
                  for(int i=1;i<=n+1;i++){ // 贪心法求解对于给定的x,按照上述组合方式所需移开的最小石头个数,注意这里i循环到n+1,而不是n(想想为什么)Sum=record[i]-record[ans];if(Sum<mid) // 若距离小于mid,则说明要移开第i个石头Count++; // 移开石头数增加else{ // 否则 从 第 i 个石头开始重新检验ans=i; }}if(Count>m) //若最小移开石头数大于m,则说明该数大了,要减小right=mid-1;elseleft=mid+1;//否则求出这些数中的最大值}printf("%d\n",right); //输出最大值return 0;}


 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 去良友花艺住宿怎么办 充气娃娃放了气怎么办 煮杜鹃根没有锅怎么办 淘宝店卖鲜花被买家拒收货怎么办 执业医师电子注册忘记密码怎么办 怀孕吃了油炸的怎么办 百合长得太高怎么办 百合的杆没了怎么办 百合花长得太细怎么办 沙漠玫瑰的花苞打不开怎么办 鲜切花 较小的花苞怎么办 大棚玫瑰苗水大涝的不长怎么办 鲜花买回来蔫了怎么办 喝玫瑰醋上火了怎么办 插在花泥上的花怎么办 插的花蔫了怎么办 紫睡莲的茎软了怎么办 家养的荷花烂叶怎么办 家养的荷花叶老是枯萎怎么办 新买的绣球蔫了怎么办 绣球花被太阳晒阉了怎么办 羊肉香精放多了怎么办 被飞机防腐剂弄到皮肤怎么办 狗吃了脱氧保鲜剂呕吐怎么办 小孩误吃试纸了保鲜剂怎么办 狗狗把保鲜剂吃了怎么办 小孩吃了防潮珠怎么办 狗吃了防潮剂怎么办 洋桔梗有点烂根怎么办 变色球花枯萎了怎么办 桔梗花叶子蔫了怎么办 洋桔梗头垂下来怎么办 洋桔梗花容易折断怎么办 眼睛被火炮炸伤了怎么办 逆水寒包裹满了怎么办 逆水寒包裹里满了怎么办 grim soul包裹满了怎么办 剑三包裹满了怎么办 电脑开机后都是英文怎么办 欠员工工资仲裁老板不到庭怎么办 乔丹拖鞋鞋底硬怎么办