Codeforces Round #719 (Div. 3) (E F )

这篇博客探讨了两个算法问题:一是如何通过求中位数找到一维点集的最小移动步数使其相邻;二是如何利用二分查询在未知01串中找到第k个0的位置。文章介绍了思路和解题方法,包括点到中位数的距离之和最小化以及二分查询的右界更新策略。
摘要由CSDN通过智能技术生成

E. Arranging The Sheep

传送门

题目大意:给定n个点的位置(一维),求最小移动步数(每次只能移一步,且不能越过其他点),使它们挨在一起

思路:求中位数

不妨将点都转化到数轴上,求一个点,使得所有点到它的距离之和最小,初中就学过这个点是它们的中位数。

设每个点到处于中位数那点的距离为xi,每个点与中位数的下标差为yi,则答案为∑(xi -yi)(i:1~n)

 

 

F1. Guess the K-th Zero (Easy version)

传送门

题目大意:有一个长度为n的隐藏01串,求第k个0的位置,每次可以询问得到区间中1的数量

我的交互题一血

二分询问的右界

假设每次回答为a,则当 a + k <= mid 时,说明整个区间大了,r=mid-1

反之 l = mid + 1(endl好像会自动清楚缓存区?不需要fflush(stdout)了)

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
typedef long long ll;
const int N=2e5+10;
int n,t,k;
void solve()
{
    int l=1,r=n;
    int res=n;
    //二分询问的右界
    while( l<=r )
    {
        int mid=(l+r)>>1;
        cout<<"? "<<1<<" "<<mid<<endl;
        int a;
        cin>>a;
        // a + k <= mid右界 ,说明区间大了
        if( mid - a >= k) r=mid-1;
        else l = mid+1;
    }
        cout<<"! "<<l<<endl;
}
signed main()
{
    ///!!!
//    freopen("data.txt","r",stdin);
    //!!!
    IOS;
    cin>>n>>t>>k;
    solve();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值