美文网首页
2020-09-14 跳石头

2020-09-14 跳石头

作者: JalorOo | 来源:发表于2020-09-14 19:39 被阅读0次

https://www.luogu.com.cn/problem/P2678

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

//template<typename DataType>
//DataType qmi(DataType m, int k)
//{
//    DataType res = 1, t = m;
//    while (k)
//    {
//        if (k&1) res = res * t;
//        t = t * t;
//        k >>= 1;
//    }
//    return res;
//}


int qmi(int m, int k)
{
    int res = 1, t = m;
    while (k)
    {
        if (k&1) res = res * t;
        t = t * t;
        k >>= 1;
    }
    return res;
}

int read(){
    int x = 0,f = 1;
    char c = getchar();
    while (c<'0'||c>'9') {
        if (c=='-') {
            f = -1;
        }
        c = getchar();
    }
    while (c>='0'&&c<='9') {
        x = x*10+c-'0';
        c = getchar();
    }
    return x*f;
}

#define fi(a,b) for(int i = a; i <= b; i++)
#define fj(a,b) for(int j = a; j >= b; j--)

struct priceAndCnt{
    int price,cnt;
};

void quickSort(priceAndCnt *a,int left,int right){
    int i,j;
    
    priceAndCnt temp,t;
    
    temp = a[(left+right)/2];//基准值
    
    i = left;
    j = right;
    
    while(i<=j){
        while (a[j].price > temp.price) {
            j--;
        }
        
        while (a[i].price < temp.price) {
            i++;
        }
        
        if (i<=j) {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
            //继续下一步
            i++;
            j--;
        }
    }
    
    if(left<j)quickSort(a,left, j);//继续分治
    if(i<right)quickSort(a,i, right);//继续分治
}


int L,N,M;
int arr[50000];

bool judge(int x){//judge函数,x代表当前二分出来的答案
    int tot = 0;//tot代表计数器,记录以当前答案需要移走的实际石头数
    int i = 0;//i代表下一块石头的编号
    int now = 0;//now代表模拟跳石头的人当前在什么位置
    while (i < N+1){//千万注意不是n,n不是终点,n+1才是
        i++;
        if (arr[i] - arr[now] < x)//判断距离,看二者之间的距离算差值就好
            tot++;//判定成功,把这块石头拿走,继续考虑下一块石头
        else
            now = i;//判定失败,这块石头不用拿走,我们就跳过去,再考虑下一块
    }
    if (tot > M)
        return false;
    else
        return true;
}

int main()
{
    L = read();
    N = read();
    M = read();
    
    fi(1, N){
        arr[i] = read();
    }
    
    arr[ N+1 ] = L;//敲黑板划重点,再强调一遍,n不是终点
    int l = 1;//l和r分别代表二分的左边界和右边界
    int r = L;
    int ans = 0;
    while (l <= r){//非递归式二分正常向写法,可理解为一般框架
        int mid = (l + r) / 2;//这再看不出是啥意思可以退群了
        if ( judge(mid) ){//带入judge函数判断当前解是不是可行解
            ans = mid;
            l = mid + 1;//走到这里,看来是可行解,我们尝试看看是不是有更好的可行解
        }
        else
            r = mid - 1;//噫,你找了个非法解,赶紧回到左半边看看有没有可行解
    }
    cout << ans << endl;//最后的ans绝对是最优解
    return 0;
}
/*
3 7
232
124
456
============
114
*/

相关文章

  • 2020-09-14 跳石头

    https://www.luogu.com.cn/problem/P2678

  • 石头情缘

    草地跳芭蕾, 石头亦有情。 心中无挂碍, 脚下坎轲平。

  • Python-正确删除列表中的指定列表

    title: Python-删除列表中的列表date: 2020-09-14 22:12:14tags: Pyth...

  • POJ-2253 Frogger(一个不能用floyd的floy

    题目大意 有两只青蛙,分别在两个石头上,青蛙GG想跳到青蛙MM所在的石头上。它有两种跳法:1、直接跳到MM的石头上...

  • 孩子告诉你他怕死,怎么办?

    昨天晚上,石头突然说:“妈妈,我害怕”。 我问他,怕什么? 石头回答:“我怕死”。 着实吓我一跳,猛然间想起我小时...

  • 孩子需要引导

    儿子在公园和小朋友跳石头,共有四个小孩,其他三个有的比他小,有的是女孩,所以在跳的过程当中,有的不会跳,有的胆小的...

  • 相亲 二

    二 不多时,身后传来周姨闺女的喊声“石头哥哥,你在外面干嘛,不冷迈。”石头转身看着这个被他刚来就吓一跳...

  • 【阿琪塔空间】测试,你天生是个旺夫的女人吗?

    不妨做个测试了解一下,你有天生旺夫好个性吗? 1、当你玩“剪刀石头布”的时候,通常先出什么? 剪刀——跳2 石头—...

  • MySQL增删改查(基础)

    2020-09-14 MySQL增删改查操作 DQL:数据查询语言DML:数据操作语言DCL:数据控制语言DDL:...

  • 公路

    暖阳遍地开花 静谧之路遥无尽头 交臂间跳支舞 踢开粉碎的石头

网友评论

      本文标题:2020-09-14 跳石头

      本文链接:https://www.haomeiwen.com/subject/jfqtyktx.html