C. Quiz Master

原题链接

题解

1.只需要求最大值和最小值之差,所以最大值和最小值之间放几个数放什么数都无所谓
2.既然只需要求最大值和最小值,那么我们可以把数组升序排序,然后求以每个值为最大值时,与最小值的差
3.按照升序排序后,最大值越大,最小值不会更小

code

#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
int a[100005];
int vis[100005]={0};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=m;i++) vis[i]=0;
        sort(a+1,a+1+n);

        int l=1;
        int ans=2e9;
        int cnt=0;
        for(int r=1;r<=n;r++)
        {
            for(int k=1;k*k<=a[r]&&k<=m;k++)
            {
                if(a[r]%k) continue;

                if(!vis[k]) cnt++;
                vis[k]++;

                if(k*k==a[r]||a[r]/k>m) continue;
                if(!vis[a[r]/k]) cnt++;
                vis[a[r]/k]++;
            }
            while(cnt==m)
            {
                ans=min(a[r]-a[l],ans);
                for(int k=1;k*k<=a[l]&&k<=m;k++)
                {
                    if(a[l]%k) continue;

                    vis[k]--;
                    if(!vis[k]) cnt--;

                    if(k*k==a[l]||a[l]/k>m) continue;
                    vis[a[l]/k]--;
                    if(!vis[a[l]/k]) cnt--;
                }
                l++;
            }

        }
        if(ans==inf) puts("-1");
        else  cout<<ans<<endl;
    }
    return 0;
}

posted @   纯粹的  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示