NOIP 2015 提高组 复赛 day2 stone 跳石头

NOIP 2015 提高组 复赛 day2 stone 跳石头

在研究二分法(二分查找),选中了该道题。

1.阅读题目,发现有很明显二分法(二分查找)痕迹,“这些岩石按与起点距离从小到大的顺序给出”。

2.第一步,先手动模拟样例输入输出数据。

3.第二步,编程实现,争取通过样例。

4.该题的核心是移石头,移的石头过多,要将跳跃长度变短,移的石头过少,要将跳跃长度变长。

5.稍微调了程序,样例通过,提交AC。该题是二分法的变形,与标准的二分搜索略有不同。详见代码。

附上AC代码,编译环境Dev-C++4.9.9.2.

#include <stdio.h>
int a[50000+10];
int L,n,m;
int check(int k){
    int i;
    int last;
    int count;
    last=0;
    count=0;
    for(i=1;i<=n;i++){
        if(a[i]-last<k)
            count++;
        else
            last=a[i];
    }
    return count;
}
int main(){    
    int left,right,mid;
    int i;
    scanf("%d%d%d",&L,&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    a[0]=0;
    a[n+1]=L;
    n++;
    left=0;
    right=L;
    while(left<=right){
        mid=(left+right)/2;
        if(check(mid)>m)//移得太多 
            right=mid-1;
        else// 移得太少 
            left=mid+1;
    }
    printf("%d\n",left-1);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值