码迷,mamicode.com
首页 > 其他好文 > 详细

7.18每日一题题解

时间:2020-07-18 22:42:04      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:需要   using   cstring   font   链接   每日   string   const   contest   

树上求和

涉及知识点:

  • 二分
  • 思维

solution:

  • 二分出答案
  • 假设答案是x的话,判断我们至少删除几个可以到达x
  • 如果我们需要删除的数量大于m的话,那么此时答案一定是比小的(right = mid - 1)
  • 否则x就有可能是答案(left = mid)

std:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m,l;
const int N = 5e4 + 10;
int a[N];

bool check(int x)
{
    int last = l;
    int cnt = 0;
    for(int i = n; i >= 0;i --)
    {
        if(last - a[i] < x){
            cnt ++; // 如果此时的距离比x小的话,那么这个就可以被删除
        }
        else{
            last = a[i]; // 更新最后一个石头
        }
    }
    
    if(cnt > m)return false;
    else return true;
    
}

int main()
{
    cin >> l >> n >> m;
    
    for(int i = 1;i <= n;i ++)
    {
        cin >> a[i];
    }
    
    int left = 0,right = l;
    
    while(left < right)
    {
        int mid = left + right + 1 >> 1;
        if(check(mid)){
            left = mid;
        }
        else{
            right = mid - 1;
        }
    }
    
    cout << left << endl;
    
    return 0;
}

7.18每日一题题解

标签:需要   using   cstring   font   链接   每日   string   const   contest   

原文地址:https://www.cnblogs.com/QFNU-ACM/p/13336751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!