蓝桥云课——班级活动

解题思路

1.首先用哈希表存储key为id,value为数量累加值
2.如果id的value值比2多,就累加起来到diff中。(因为对应的id已经被匹配过,剩下的为需要修改才能匹配) 如果id的value值等于1,就累加到one中。(因为id是两两相匹配,只有一个的id无法与其他id匹配)
3.最后遍历哈希表,有两种情况
①diff>=one
这个时候直接输出diff,因为diff为必须修改的值,这样才能匹配成功,比如[4,4,2,2]这时至少完成四步修改才能使这四个数匹配。而对于one的值,是在完成diff修改时顺便匹配上的,比如[4,4,2,3]这个时候可以把前面两个4修改成2和3即[2,3,2,3],至少需要diff步就可以完成。
②diff<one
这个时候输出diff+(one-diff)/2,前面说过diff是必须完成的修改数值,此时完成了diff步,但是one比diff多,还有一些单个的值没有匹配比如[3,3,3,4,5,6,7,8]。修改完diff步为[4,5,6,4,5,6,7,8]此时还有两个数没有匹配,只需要修改一个数为另一个数就可以,这就是为什么最后要除2的原因了。
还有人可能会考虑为奇数的情况,因为n规定是偶数,又是两两匹配,最后的diff+one一定为偶数,因为偶数+偶数=偶数。
此时的diff与one会有两种情况,奇数+奇数、偶数+偶数。
①:奇数+奇数
diff>=one,直接输出diff不需要考虑除2的问题
diff<one,one-diff两个奇数相减结果为偶数因此也不考虑除2问题
②:偶数+偶数
diff>=one,直接输出diff不需要考虑除2的问题
diff<one,one-diff两个偶数相减结果为偶数因此也不考虑除2问题

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int diff=0;
        int one=0;
        int ans=0;
        int array[]=new int[n];
        Map<Integer,Integer> hash=new HashMap<>();
        for(int i=0;i<n;i++)
        {
          array[i]=scan.nextInt();
          hash.put(array[i],hash.getOrDefault(array[i],0)+1);
        }
        for(int a:hash.values())
        {
          if(a-2>0)
          {
            diff+=a-2;//统计没有成一对的数量(多余的)
          }
          if(a==1)
          {
            one++;//统计单个的数量
          }
        }
        if(diff>=one)
        {
            System.out.print(diff);
        }
        else{
            System.out.print(diff+(one-diff)/2);
        }
        scan.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值