哈尔滨理工大学软件与微电子学院程序设计竞赛题解

题目链接

A.Race

题意:
小 红 和 小 明 赛 跑 , 速 度 分 别 为 v 1 , v 2 , 如 果 小 明 在 某 个 整 数 秒 超 过 小 红 t 米 及 以 上 小红和小明赛跑,速度分别为v1,v2,如果小明在某个整数秒超过小红t米及以上 v1,v2t
就 停 下 来 休 息 s 秒 , 赛 道 长 总 共 l 米 , 问 谁 会 赢 就停下来休息s秒,赛道长总共l米,问谁会赢 sl
题解:
l < = 10000 , 并 且 l 是 v 1 , v 2 的 公 倍 数 l<=10000,并且l是v1,v2的公倍数 l<=10000,lv1,v2
所 以 直 接 模 拟 每 秒 , 如 果 他 俩 距 离 大 于 等 于 t 所以直接模拟每秒,如果他俩距离大于等于t t
就 让 小 明 停 止 就让小明停止
看 他 俩 谁 先 到 终 点 或 者 同 时 到 达 看他俩谁先到终点或者同时到达
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int v1,v2,t,s,l;
    cin>>v1>>v2>>t>>s>>l;
    int sec=1,a=0,b=0,f=0;
    while(1){
        if(a-b>=t&&!f)f=s;
        if(!f)a+=v1;
        else f--;
        b+=v2;
        if(a==l||b==l)break;
        sec++;
    }
    if(a==l&&b==l)cout<<"Tie "<<sec;
    else if(a==l)cout<<"Ming "<<sec;
    else cout<<"Hong "<<sec;
    return 0;
}



B.Min Value

题意:
给 n 个 整 数 , 找 出 任 意 两 个 数 使 得 a b s ( a i + a j ) 最 小 给n个整数,找出任意两个数使得abs(a_i+a_j)最小 n使abs(ai+aj)
在 这 个 前 提 下 使 i + j 最 小 在这个前提下使i+j最小 使i+j
题解:
对 于 每 个 数 相 加 a b s 最 小 的 就 是 他 的 负 数 对于每个数相加abs最小的就是他的负数 abs
所 以 直 接 找 每 个 数 的 负 数 及 其 左 右 两 边 数 所以直接找每个数的负数及其左右两边数
并 且 提 前 维 护 序 号 , 如 果 值 相 同 尽 量 找 到 小 的 i + j 并且提前维护序号,如果值相同尽量找到小的i+j i+j
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};

struct node{
    int x,id;
    bool operator <(const node &t)const{
        return x<t.x;
    }
}a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i].x,a[i].id=i;
    sort(a+1,a+1+n);
    int ans1=inf,ans2;
    for(int i=1;i<=n;i++){
        int p=lower_bound(a+1,a+1+n,(node){-a[i].x,a[i].id})-a;
        p=max(1,p);
        if(p>1&&p-1!=i)
            if(abs(a[i].x+a[p-1].x)<ans1)ans1=abs(a[i].x+a[p-1].x),ans2=a[i].id+a[p-1].id;
            else if(abs(a[i].x+a[p-1].x)==ans1)ans2=min(ans2,a[i].id+a[p-1].id);
        if(p!=i)
            if(abs(a[i].x+a[p].x)<ans1)ans1=abs(a[i].x+a[p].x),ans2=a[i].id+a[p].id;
            else if(abs(a[i].x+a[p].x)==ans1)ans2=min(ans2,a[i].id+a[p].id);
        if(p+1<=n&&p+1!=i)
            if(abs(a[i].x+a[p+1].x)<ans1)ans1=abs(a[i].x+a[p+1].x),ans2=a[i].id+a[p+1].id;
            else if(abs(a[i].x+a[p+1].x)==ans1)ans2=min(ans2,a[i].id+a[p+1].id);
    }
    cout<<ans1<<' '<<ans2;
    return 0;
}



C. Coronavirus

题意:
n ∗ m 的 图 中 有 高 危 路 段 , 用 ∗ 表 示 n*m的图中有高危路段,用*表示 nm
每 个 以 高 危 路 段 为 中 心 的 九 宫 格 都 不 能 走 每个以高危路段为中心的九宫格都不能走
问 从 S 到 E 最 少 需 要 多 少 步 或 者 确 定 不 能 到 达 问从S到E最少需要多少步或者确定不能到达 SE
题解:
先 对 不 能 走 的 路 进 行 标 记 先对不能走的路进行标记
枚 举 整 个 图 如 果 遇 到 星 号 之 间 对 周 围 的 九 宫 格 进 行 标 记 枚举整个图如果遇到星号之间对周围的九宫格进行标记
然 后 直 接 b f s , 队 列 中 维 护 坐 标 和 步 数 然后直接bfs,队列中维护坐标和步数 bfs
如 果 坐 标 对 应 的 是 终 点 输 出 步 数 , 否 则 最 后 输 出 不 能 到 达 如果坐标对应的是终点输出步数,否则最后输出不能到达
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};

char g[100][100];
bool vis[100][100];
struct node{
    int x,y,s;
};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,m;
    cin>>n>>m;
    int sx,sy;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
            if(g[i][j]=='S')sx=i,sy=j;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(g[i][j]=='*'){
                vis[i][j]=1;
                for(int k=0;k<8;k++){
                    int dx=i+dir[k][0];
                    int dy=j+dir[k][1];
                    if(dx<1||dx>n||dy<1||dy>m)continue;
                    if(g[dx][dy]=='E'){cout<<"Impossible";return 0;}
                    vis[dx][dy]=1;
                }
            }
    queue<node> q;
    q.push((node){sx,sy,0});vis[sx][sy]=1;
    while(!q.empty()){
        node p=q.front();
        q.pop();
        if(g[p.x][p.y]=='E'){cout<<p.s;return 0;}
        for(int i=0;i<4;i++){
            int dx=p.x+dir[i][0];
            int dy=p.y+dir[i][1];
            if(dx<1||dx>n||dy<1||dy>m||vis[dx][dy])continue;
            vis[dx][dy]=1;
            q.push((node){dx,dy,p.s+1});
        }
    }
    cout<<"Impossible";
    return 0;
}



D. Array

题意:
一 个 数 组 全 部 异 或 的 值 为 x , 全 部 相 加 为 y 一个数组全部异或的值为x,全部相加为y xy
问 数 组 最 短 长 度 是 多 少 问数组最短长度是多少
题解:
原 题 的 简 化 版 c o d e f o r c e s   r o u n d   628 D 原题的简化版 codeforces~round~628 D codeforces round 628D
本场题解连接
链 接 里 的 d 题 有 详 细 题 解 链接里的d题有详细题解 d
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ll u,v;
    while(cin>>u>>v){
        if(v-u<0||(v-u)%2){cout<<-1<<endl;continue;}
        ll d=v-u;
        if(!d){
            if(!u)cout<<0;
            else cout<<1;
        }
        else{
            ll t=d/2;
            if((t&u)==0)cout<<2;
            else cout<<3;
        }
        cout<<endl;
    }
    return 0;
}



G.XOR

题意:
已 知 n , 从 1 到 n 中 选 任 意 两 个 数 异 或 已知n,从1到n中选任意两个数异或 n1n
这 个 异 或 的 最 大 值 为 多 少 这个异或的最大值为多少
题解:
最 大 值 很 明 显 尽 量 是 让 每 个 数 都 为 1 最大值很明显尽量是让每个数都为1 1
那 么 比 如 n 的 二 进 制 位 101010100 那么比如n的二进制位101010100 n101010100
那 肯 定 是 拿 100000000 和 1111111 异 或 那肯定是拿100000000和1111111异或 1000000001111111
最 后 全 部 为 1 就 是 结 果 最后全部为1就是结果 1
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ll n;
    cin>>n;
    if(n==1){cout<<0;return 0;}
    ll ans=0,cnt=0;
    while(n)ans+=(1ll<<cnt),cnt++,n>>=1;
    cout<<ans;
    return 0;
}



H.Maze

题意:
n ∗ m 的 图 , 图 中 包 含 + 或 者 − n*m的图,图中包含+或者- nm+
每 个 点 能 往 四 个 方 向 和 自 己 符 号 不 同 的 位 置 走 每个点能往四个方向和自己符号不同的位置走
q 次 询 问 , 问 从 某 个 点 开 始 最 多 能 走 向 多 少 个 不 同 点 q次询问,问从某个点开始最多能走向多少个不同点 q
题解:
只 要 符 号 不 同 就 可 以 走 只要符号不同就可以走
并 且 不 限 制 来 回 , 可 以 走 过 去 的 点 也 可 以 回 来 并且不限制来回,可以走过去的点也可以回来
所 以 完 全 可 以 对 每 个 直 接 b f s 所以完全可以对每个直接bfs bfs
但 是 为 了 防 止 超 时 , 所 以 考 虑 用 并 查 集 但是为了防止超时,所以考虑用并查集
相 邻 不 同 点 在 一 个 集 合 , 只 要 是 一 个 集 合 里 的 点 都 可 以 到 达 相邻不同点在一个集合,只要是一个集合里的点都可以到达
所 以 只 要 查 询 每 个 点 所 在 集 合 有 多 少 点 就 是 答 案 所以只要查询每个点所在集合有多少点就是答案
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int n,m;
char g[3010][3010];
int fa[10000010],sz[10000010];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
int id(int i,int j){
    return (i-1)*m+j;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int q;
    cin>>n>>m>>q;
    for(int i=1;i<=n*m;i++)fa[i]=i;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>g[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=0;k<4;k++){
                int dx=i+dir[k][0];
                int dy=j+dir[k][1];
                if(dx<1||dx>n||dy<1||dy>m||g[dx][dy]==g[i][j])continue;
                fa[find(id(i,j))]=find(id(dx,dy));
            }

    for(int i=1;i<=n*m;i++)sz[find(i)]++;
    for(int i=1;i<=n*m;i++)sz[i]=sz[find(i)];
    while(q--){
        int x,y;
        cin>>x>>y;
        cout<<sz[id(x,y)]<<endl;
    }
    return 0;
}



I.Prime

题意:
q 次 询 问 , 每 次 询 问 l 到 r 中 有 多 少 个 素 数 q次询问,每次询问l到r中有多少个素数 qlr
题解:
l , r < = 1 e 7 l,r<=1e7 l,r<=1e7
所 以 不 能 每 次 暴 力 查 询 所以不能每次暴力查询
那 么 就 用 素 数 筛 找 出 所 有 排 好 序 的 质 数 那么就用素数筛找出所有排好序的质数
然 后 用 l o w e r b o u n d 和 u p p e r b o u n d 进 行 边 界 查 找 然后用lower_bound和upper_bound进行边界查找 lowerboundupperbound
看 数 组 中 间 有 多 少 个 即 可 看数组中间有多少个即可
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
 
int prime[maxn];
bool isprime[10000010];
int num=0;
void Prime(int n){
    memset(isprime,true,sizeof(isprime));
    for(int i=2;i<=n;i++){
        if(isprime[i]) prime[++num]=i;
        for(int j=1;j<=num;j++){
            if(i*prime[j]>n) break;
            isprime[i*prime[j]]=false;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    Prime(10000000);
    int _;
    cin>>_;
    while(_--){
        int l,r;
        cin>>l>>r;
        int p=lower_bound(prime+1,prime+1+num,l)-prime-1;
        int q=upper_bound(prime+1,prime+1+num,r)-prime-1;
        cout<<q-p<<endl;
    }
    return 0;
}

J.Compare

题意:
给 数 a , b , 如 果 a < b 输 出 < 给数a,b,如果a<b输出< a,ba<b<
a = = b 输 出 = a==b输出= a==b=
a > b 输 出 > a>b输出> a>b>
题解:
a , b < = 1 0 100000 a,b<=10^{100000} a,b<=10100000
数 很 大 , 需 要 用 高 精 度 的 判 断 数很大,需要用高精度的判断
我 这 里 直 接 用 了 p y t h o n 来 写 我这里直接用了python来写 python
AC代码

a=int(input())
b=int(input())
if a>b :
    print('>')
elif a==b:
    print('=')
else :
    print('<')


K.Walk

题意:
t 次 询 问 从 1 , 1 到 n , m 有 多 少 种 最 短 的 走 法   m o d 1 e 9 + 7 t次询问从1,1到n,m有多少种最短的走法~mod1e9+7 t11n,m mod1e9+7
题解:
n , m < = 1 e 6 n,m<=1e6 n,m<=1e6
按 理 说 应 该 用 d p 进 行 转 移 按理说应该用dp进行转移 dp
最 短 走 法 应 该 只 往 下 和 右 走 最短走法应该只往下和右走
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1]
但 是 这 个 n , m 较 大 , 不 支 持 用 二 维 数 组 和 复 杂 度 , 并 且 还 是 多 组 输 入 但是这个n,m较大,不支持用二维数组和复杂度,并且还是多组输入 nm
那 么 直 接 用 组 合 数 进 行 计 算 那么直接用组合数进行计算
从 ( 1 , 1 ) 到 ( n , m ) 的 路 径 往 右 和 往 下 总 共 走 n + m − 2 次 从(1,1)到(n,m)的路径往右和往下总共走n+m-2次 (1,1)(n,m)n+m2
其 中 往 下 走 包 括 n − 1 次 , 那 么 直 接 C n + m − 2 n − 1 其中往下走包括n-1次,那么直接C_{n+m-2}^{n-1} n1Cn+m2n1
从 n + m − 2 步 中 选 出 n − 1 步 往 下 走 , 剩 下 的 步 数 往 右 走 从n+m-2步中选出n-1步往下走,剩下的步数往右走 n+m2n1
所 以 直 接 预 处 理 + 逆 元 使 用 组 合 数 所以直接预处理+逆元使用组合数 +使
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=2e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
ll fact[maxn],inv1[maxn];
ll Pow(ll a, ll b){
	ll ans = 1;
	while(b > 0){
		if(b & 1){
			ans = ans * a % mod;
		}
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}
//逆元
ll inv(ll b){
    return Pow(b,mod-2)%mod;
}



ll C(ll n,ll m){
    if(m>n||n<0||m<0)return 0;
    if(m==0||m==n) return 1;
    ll res=(fact[n]*inv1[m]%mod*inv1[n-m])%mod;
    return res;
}

void init() {
	fact[0] = 1;
	for (int i = 1; i < maxn; i++) {
		fact[i] = fact[i - 1] * i %mod;
	}
	inv1[maxn - 1] = Pow(fact[maxn - 1], mod - 2);
	for (int i = maxn - 2; i >= 0; i--) {
		inv1[i] = inv1[i + 1] * (i + 1) %mod;
	}
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    init();
    int _;
    cin>>_;
    while(_--){
        int n,m;
        cin>>n>>m;
        cout<<C(n+m-2,n-1)<<endl;
    }
    return 0;
}


L. Defeat the monster

题意:
给 n 个 人 , 每 个 人 都 有 能 力 值 给n个人,每个人都有能力值 n
要 组 一 队 人 探 险 , 这 一 队 人 能 力 极 差 不 能 超 过 5 要组一队人探险,这一队人能力极差不能超过5 5
问 这 一 组 最 多 可 以 有 多 少 人 问这一组最多可以有多少人
题解:
肯 定 需 要 先 进 行 排 序 , 然 后 选 一 段 符 合 条 件 的 连 续 子 串 肯定需要先进行排序,然后选一段符合条件的连续子串
所 以 可 以 考 虑 用 尺 取 方 法 去 做 所以可以考虑用尺取方法去做
但 是 由 于 尺 取 写 起 来 不 好 下 手 但是由于尺取写起来不好下手
所 以 我 考 虑 的 是 l o w e r b o u n d 和 u p p e r b o u n d 进 行 查 找 所以我考虑的是lowerbound和upperbound进行查找 lowerboundupperbound
对 每 个 数 , 查 找 他 a i − j 到 a i + 5 − j 之 内 的 数 对每个数,查找他a_i-j到a_i+5-j之内的数 aijai+5j
也 就 是 以 他 为 一 个 点 找 他 附 近 符 合 条 件 的 , 找 尽 量 大 的 长 度 也就是以他为一个点找他附近符合条件的,找尽量大的长度
AC代码

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};

int a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=5;j++){
            int p=lower_bound(a+1,a+1+n,a[i]-j)-a-1;
            int q=upper_bound(a+1,a+1+n,a[i]+5-j)-a-1;
            p=max(0,p);q=min(n,q);
            ans=max(ans,q-p);
        }
    }
    cout<<ans;
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值