解题思路:

    将原序列分为奇序列和偶序列来看,两条序列各自遍历计数,得出各自的最多数(个数)次多数。若 奇最多的值(对应的数值) 不等于 偶最多的值,则 总修改次数 = n- 奇最多 -偶最多;若 奇最多的值 等于 偶最多的值 ,则需要加入次多数进行替代,取 奇最多+偶次多 和 偶最多+奇次多 之中的最多者,然后 总修改次数=n-这个最多者。

注意事项:

    注意 奇次多 和 偶次多 可能不存在,那么就直接将它们的数量置为0即可。其次就是不需要关注 奇次多的值 和 偶次多的值,我们只在 奇最多的值 等于 偶最多的值时,才考虑它们,那它们一定不会和 奇最多的值 和 偶最多的值 相等。

参考代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;


// 小蓝的序列
public class Main {

	public static void main(String[] args) throws IOException {
			
		func1();
		
	}
	
	public static void func1() throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.valueOf(bf.readLine().trim());
		String[] numStrings = bf.readLine().trim().split("\\s+");
		
		HashMap<Integer, Integer> JMap = new HashMap<Integer, Integer>();
		HashMap<Integer, Integer> OMap = new HashMap<Integer, Integer>();
		
		for(int i=0; i<n; i+=2) {
			int Onum = Integer.valueOf(numStrings[i]);
			
			if(OMap.containsKey(Onum)) {
				OMap.put(Onum, OMap.get(Onum)+1);
			}else {
				OMap.put(Onum, 1);
			}
			
		}
		
		for(int i=1; i<n; i+=2) {
			int Jnum = Integer.valueOf(numStrings[i]);
			
			if(JMap.containsKey(Jnum)) {
				JMap.put(Jnum, JMap.get(Jnum)+1);
			}else {
				JMap.put(Jnum, 1);
			}
			
		}
		
		int[][] JnumsArray = new int[JMap.size()][2];
		int[][] OnumsArray = new int[OMap.size()][2];
		
		int i=0;
		for(Entry<Integer, Integer> entrys :JMap.entrySet()) {
			JnumsArray[i][0] = entrys.getKey();
			JnumsArray[i][1] = entrys.getValue();
			i++;
		}
		
		i=0;
		for(Entry<Integer, Integer> entrys :OMap.entrySet()) {
			OnumsArray[i][0] = entrys.getKey();
			OnumsArray[i][1] = entrys.getValue();
			i++;
		}
		
		Arrays.sort(JnumsArray,(a,b)->{
			return b[1] - a[1];
		});
		Arrays.sort(OnumsArray,(a,b)->{
			return b[1] - a[1];
		});
		
		int tempJ = JnumsArray[0][0];
		int tempO = OnumsArray[0][0];
		
		int countJ = JnumsArray[0][1];
		int countO = OnumsArray[0][1];
		
		int countSum = 0;
		
		if(tempJ==tempO) {  // 如果奇列和偶列最多数的值相同
			
			int countJNext;
			if(JnumsArray.length<=1) {  // 奇列只有一种数
				countJNext=0;
			}else {
				countJNext = JnumsArray[1][1];
			}
			
			int countONext;
			
			if(OnumsArray.length<=1) {  // 偶列只有一种数
				countONext=0;
			}else {
				countONext = OnumsArray[1][1];
			}
			
			int nnSum1 = countJ + countONext;
			int nnSum2 = countO + countJNext;
			
			countSum = nnSum1>nnSum2 ? nnSum1 : nnSum2;

		}else {
			countSum = countJ + countO;
		}
		
		System.out.println(n-countSum);
	
	}

}

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论