0
点赞
收藏
分享

微信扫一扫

中位数切分题解

左手梦圆 2022-02-27 阅读 33

目录

题目描述

输入描述:

输出描述:

输入

输出

思路:

代码:


题目描述

给定一个长为n的数组a和一个整数m,你需要将其切成连续的若干段,使得每一段的中位数都大于等于m,求最多可以划分成多少段。

我们定义,偶数个数的中位数为中间两个数中较小的那一个,奇数个数的中位数就是正中间的数。如[2,3,1,5]的中位数为2,[2,3,1,2]的中位数为2,[3,5,9,7,11]的中位数为7。

输入描述:

输入第一行是一个整数T(1≤T≤20),测试组数。

每个测试第一行是两个整数n,m(1≤n≤105,1≤m≤109),含义如题目所示。

第二行输入n个数,数组a,满足1≤ai​≤109。

由于本题输入量较大,建议使用scanf等高效输入方式。

输出描述:

每个测试用例,输出一个整数,表示最多可以划分成多少段,若无论如何划分都不能满足条件,输出−1。

示例1

输入

4
5 4
10 3 2 3 2
5 3
5 2 3 3 2
2 5
4 5
5 2
10 3 2 3 2

输出

-1
1
-1
5

思路:

1,找规律,

2,中位数大于等于m的最大切分段数

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        int ans=0;
        for(int i=1;i<=n;++i)
        {
            int x;
            cin>>x;
            if(x>=m)ans++;
            else ans--;
        }
        if(ans>0)cout<<ans<<'\n';
            else cout<<-1<<'\n';
    }
    
    
    return 0;
}
举报

相关推荐

0 条评论