zoukankan      html  css  js  c++  java
  • noip 2015 day2 t1 跳石头 二分

       

        没办法,弱小的我就从水题开始吧!

        今年noip2015 day2 的 t1 是比较常见的求最小值最大的题,这一些在训练指南第一章中曾多次出现, 其中lrj曾说“解决“最小值最大”的常用方法是二分答案”。所以在比赛的时候弱小的我唯一想到的也就是二分了。

        接着便是核心便是对于判断函数的处理。

        我当时采取的策略是从左往右扫,然后只删右边,不删左边,因为是从左往右扫,所以左边的石子一定能满足条件。

       这样,这道题就出来了,最后说一句细心很重要,因为没有考虑最后一颗石子到终点的距离而失分。

       就这样吧!第一次写博客,感觉不错。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define rep(i,j,k) for(int i = j; i <= k; i++)
    using namespace std;
    int a[50001] = {0};
    int num[50001] = {0};
    int n, m, k;
    
    int read()
    {
        int s = 0;
        char c = getchar();
        while( !isdigit(c) ) c = getchar();
        while( isdigit(c) ){
            s = s * 10 + c - '0';
            c = getchar();
        }
        return s;
    }
    
    bool chu(int x)
    {
        memcpy(num,a,sizeof(a));
        int tot = 0;
        rep(j,1,m){
            if( num[j] - num[j-1] < x ) {
                num[j] -= (num[j]-num[j-1]);
                tot++;
            }
            if( tot > k ) return 0;
        }
        return 1;
    }
    
    int main()
    {
        n = read(), m = read(), k = read();
        int l = 0, r = 0xfffffff;
        rep(i,1,m+1){
            if( i == m+1 ) a[i] = n;
            else a[i] = read();
            if( i > k) r = min(r,a[i]-a[i-k-1]);
        }
        while( l < r ){
            int mid = l + (r-l) / 2;
            if( l == r - 1 ) mid++;
            if( chu(mid) ) l = mid;
            else r = mid-1;
        }
        cout<<l<<endl;
        return 0;
    }
    人一我十,人十我万!追逐青春的梦想,怀着自信的心,永不放弃!仿佛已看到希望,尽管还在远方
  • 相关阅读:
    【设计模式】策略模式
    【设计模式】模板方法模式
    【C++】《Effective C++》第五章
    【C++】《Effective C++》第四章
    free命令详解(内存)
    top命令详解(动态进程)
    ps命令详解(静态进程)
    SpringBoot_集成Redis
    SpringBoot_热部署插件
    SpringBoot_实现RESTfull API
  • 原文地址:https://www.cnblogs.com/83131yyl/p/4998721.html
Copyright © 2011-2022 走看看