B. Sasha and the Apartment Purchase

题目链接:https://codeforces.com/contest/2098/problem/B

题意:

大致说有[1,1e9]个房子,还有n个酒吧分布在n个房子里(可以是相同的房子)

定义f(x)为编号为x的房子与所有开着的酒吧的直线距离

现在可以使最多k个酒吧关闭

让你求哪些房子(注意不能重复计算某一个房子)有潜力(即可以人为使一些酒吧关闭使得这个房子的f值最小

思路:

由中位数定理可知,对于一个序列,如果项数为奇数,那么最中间的数到其他数的距离之和最小
如果项数为偶数,那么 最靠近中间的 相对靠左 和 相对靠右 的那 两个数及其中间夹着的数 到其他数的距离之和最小

所以如果不删除酒吧,那么就是给的序列的中位数(或中间那些数)

然而如果要删除,那么删除后同样是个数字序列,这个数字序列同样是其中位数(中间那些数)f最小

所以是这些数更有潜力

那么要删除哪些酒吧呢?要删除多少个数呢?

显然,两边的数成为有潜力的房子的可能性更小,(因为只能删除对侧的数使得序列中间往它那一侧倾斜,如果删的不够多,就无法使它成为中位数)

而如果两边的房子可以通过操作成为答案,那么中间的那些数一定可以

所以尽可能多地删(即删k个),使答案不遗漏

不妨将留下的区间看成长度为n-k的窗口

窗口从左往右移动

那么最左边的窗口的中位数到最右边窗口的中位数

它俩囊括的数都有可能成为有潜力的数

void solve(){
    int n,k;cin>>n>>k;
    vector<int>a(n+1);
    rep(i,1,n){
        cin>>a[i];
    }
    sort(a.begin()+1,a.end());
    int left=a[floor(1.0*(1+n-k)/2)],right=a[ceil(((n-(n-k)+1)+n)*1.0/2)];
    cout<<right-left+1<<endl;
}
posted @ 2025-04-29 22:30  Marinaco  阅读(122)  评论(0)    收藏  举报
//雪花飘落效果