1 条题解

  • 0
    @ 2025-8-24 22:41:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xiaoxiaoxia
    学习,就是发现自己越来越菜的过程。||天行健,君子以自强不息|| 最后在线时间:2025年7月31日17时3分

    搬运于2025-08-24 22:41:09,当前版本为作者最后更新于2023-05-03 10:52:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目分析:

    题目给定了 NN 名用户的积分,以及系统只会匹配积分差为 KK 的两名用户。现在需要计算最多有多少名用户在线寻找对手时,系统却一场对局都匹配不起来。

    解题思路:

    1. 用一个数组 aa 记录每个积分出现的次数。
    2. 遍历数组,用贪心算法计算无法匹配的用户数。

    解题步骤:

    1. 读取输入,得到用户数量 nn 和积分差 kk
    2. 遍历用户,读取每个用户的积分 xx,并在数组 aa 中增加对应的计数。
    3. 初始化无法匹配的用户数 ansans00
    4. 如果 kk 等于 00,说明只有积分相同的用户才能匹配,遍历数组 aa,统计有积分的用户数,输出结果并返回。
    5. 遍历数组 aa 中的积分 ii00MAXNk\text{MAXN}-k),对于每个积分 ii,计算无法匹配的用户数:
    • 如果ai<ai+ka_{i} < a_{i+k},说明积分差为 kk 的用户更多,将 ai+ka_{i+k} 减去aia_{i}
    • 否则,将 ai+ka_{i+k} 置为 00
    1. 遍历数组 aa 中的积分 ii00MAXNk\text{MAXN}-k),累加无法匹配的用户数。
    2. 输出结果。

    代码部分

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 100010
    int a[MAXN];
    int n, k, x;
    int main()
    {
    	scanf("%d%d",&n,&k);
    	for(int i=0;i<n;i++) 
    	{
    		scanf("%d",&x);
    		a[x]++; 
    	} 
    	int ans=0;
    	if(k==0) 
    	{
    		for(int i=0;i<MAXN;i++)
    		{
    			if(a[i]) 
    			{
    				ans++;
    			}
    		}
    		printf("%d\n",ans);
    		return 0;
    	}
    	for(int i=0;i<MAXN-k;i++) 
    	{
    		if( a[i]<a[i+k]) 
    		{
    			a[i+k]-=a[i];
    		} 
    		else 
    		{
    			a[i+k]=0;
    		}
    	}
    	for (int i=0;i<MAXN-k;i++) 
    	{
    		ans+=a[i];
    	}
    	printf("%d\n",ans);
    	return 0;
    } 
    
    • 1

    信息

    ID
    5966
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者