小美的彩虹糖
小美有很多的彩虹糖,每颗彩虹糖都有一个颜色,她每天可以吃两颗彩虹糖,如果今天吃的彩虹糖组合是之前没吃过的组合,则小美今天会很高兴。
例如,小美有 6 颗彩虹糖,颜色分别是 [1,1,4,5,1,4]。
小红第一天吃一组颜色为 1 和 4 的彩虹糖,小美会很高兴;
第二天吃一组颜色为 4 和 1 的彩虹糖,小美不会很高兴;
第三天小美吃一组颜色为 1 和 5 的彩虹糖,小美会很高兴,此时小美共有 2 天很高兴。
小美想知道,她最多有几天会很高兴。
输入描述
第一行输入一个整数 n (1<=n<=
1
0
5
10^5
105)表示彩虹糖数量。
第二行输入 n 个整数表示彩虹糖颜色a (1<=
a
i
a_i
ai<=
1
0
9
10^9
109)。
输出描述
输出一个整数表示答案。
示例输入
6
1 1 4 5 1 4
输出
3
说明
第1天吃一组颜色为1,4的彩虹糖。
第2天吃一组颜色为4,5的彩虹糖。
第3天吃一组颜色为1,1的彩虹糖。
小美3天都会很高兴。
题解
(错误答案)
哈希表统计每个出现的次数。如果次数大于2的,先作子环(x,x),然后遍历map的key,试着去匹配,次数还有且还没匹配到最后一个,作++
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int temp = in.nextInt();
map.put(temp, map.getOrDefault(temp, 0) + 1);
}
//System.out.println(map);
Object[] array = map.keySet().toArray();
int count = 0;
for (int i = 0; i < array.length; i++) {
if (map.get(array[i]) >= 2) {
map.put((Integer) array[i], map.get(array[i]) - 2);
count++;
}
}
//System.out.println(map);
//System.out.println(count);
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (map.get(array[i]) > 0 && map.get(array[j]) > 0) {
map.put((Integer) array[i], map.get(array[i]) - 1);
map.put((Integer) array[j], map.get(array[j]) - 1);
count++;
//System.out.println(map);
}
}
}
System.out.println(count);
}
}
//22
//十个1,十个2,俩个3不对
感觉是正解
先按出现的次数从大排到小,取次数最大的,先判断能不能自环,再依次配对别人,然后取下一个。
import java.util.*;
import java.util.stream.Collectors;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Map<Integer, Integer> map = new HashMap<>();
int count = 0;
//得到 map
for (int i = 0; i < n; i++) {
int temp = in.nextInt();
map.put(temp, map.getOrDefault(temp, 0) + 1);
}
//System.out.println(map);
// 使用Stream API根据 Map的值进行排序
List<Map.Entry<Integer, Integer>> sortedMapList = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList());
int[] tempArray = new int[sortedMapList.size()];
int a = 0;
// 输出排序后的结果
for (Map.Entry<Integer, Integer> entry : sortedMapList) {
tempArray[a] = entry.getKey();
a++;
}
/*for (int j:tempArray) {
System.out.print(j+" ");
}
System.out.println();*/
for (int i = tempArray.length-1; i >=0 ; i--) {
//先匹配自己
if(map.get(tempArray[i]) >= 2){
map.put(tempArray[i], map.get(tempArray[i]) - 2);
count++;
}
//再匹别人
for (int j = i-1; j >=0 ; j--) {
//自己大于0,且想匹配的数也大于0
if (map.get(tempArray[i]) > 0 && map.get(tempArray[j]) > 0) {
map.put(tempArray[i], map.get(tempArray[i]) - 1);
map.put(tempArray[j], map.get(tempArray[j]) - 1);
count++;
}
}
}
System.out.println(count);
}
}