#P3879. 第1题-整理袜子
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 79
            Accepted: 29
            Difficulty: 2
            
          
          
          
                       所属公司 : 
                              中国电信
                                
            
                        
              时间 :25年10月11日场
                              
                      
          
 
- 
                        算法标签>哈希表          
 
第1题-整理袜子
解题思路
给定每只袜子的颜色,只有颜色相同的两只可以配成一对。核心做法是统计每种颜色出现的次数,然后对每种颜色的计数取整除 2(即 cnt // 2),最后把所有颜色能配成的对数相加即可。
相关算法:使用哈希计数(映射/字典/散列表)。 实现方法:
- 遍历输入的颜色序列,用映射结构记录每种颜色出现的次数;
 - 遍历映射,将每个颜色的次数整除 2 的结果累加得到答案。
 
由于颜色范围与数量都很小(≤10),该方法简单高效。
复杂度分析
- 时间复杂度:O(n),只需一次遍历统计与一次遍历累加。
 - 空间复杂度:O(k),k 为不同颜色的个数,最坏不超过 10。
 
代码实现
Python
import sys
# 功能函数:统计可配成的袜子对数
def count_pairs(colors):
    cnt = {}
    for c in colors:
        # 统计每种颜色的出现次数
        cnt[c] = cnt.get(c, 0) + 1
    # 对每种颜色取整除 2 后累加
    return sum(v // 2 for v in cnt.values())
def main():
    data = sys.stdin.read().strip().split()
    if not data:
        return
    n = int(data[0])
    # 读取 n 个颜色值
    arr = list(map(int, data[1:1 + n]))
    ans = count_pairs(arr)
    print(ans)
if __name__ == "__main__":
    main()
Java
import java.util.*;
// ACM 风格主类
public class Main {
    // 功能函数:统计可配成的袜子对数
    public static int countPairs(int[] a) {
        Map<Integer, Integer> map = new HashMap<>();
        // 统计每种颜色出现次数
        for (int x : a) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }
        // 累加每种颜色的对数(次数整除 2)
        int res = 0;
        for (int v : map.values()) {
            res += v / 2;
        }
        return res;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 读取总数量 n
        if (!sc.hasNextInt()) {
            sc.close();
            return;
        }
        int n = sc.nextInt();
        int[] arr = new int[n];
        // 读取 n 个颜色值
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        sc.close();
        int ans = countPairs(arr);
        System.out.println(ans);
    }
}
C++
#include <bits/stdc++.h>
using namespace std;
// 功能函数:统计可配成的袜子对数
int countPairs(const vector<int>& a) {
    unordered_map<int, int> mp;
    // 统计每种颜色出现次数
    for (int x : a) {
        mp[x]++;
    }
    // 累加每种颜色的对数(次数整除 2)
    int res = 0;
    for (auto &kv : mp) {
        res += kv.second / 2;
    }
    return res;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    if (!(cin >> n)) return 0;
    vector<int> a(n);
    // 读取 n 个颜色值
    for (int i = 0; i < n; ++i) cin >> a[i];
    int ans = countPairs(a);
    cout << ans << "\n";
    return 0;
}
        题目内容
小明准备整理衣柜里的袜子。这些袜子混在一起,共有 n 只,每只袜子都有唯一的颜色(用整数表示),只有颜色完全相同的 2 只袜子才能组成 1 对,单只袜子无法构成一对。现在小明需要统计:这堆袜子里一共能整理出多少对完整的袜子?
输入描述
第一行输入一个整数 n(1≤n≤10),表示袜子的总数量。
接下来输入 n 个整数,表示袜子的颜色 a1,a2,...,an(1≤ai≤10) ;
输出描述
输出一个整数,表示完整的袜子的对数。
样例1
输入
6
1 2 3 1 2 3
输出
3
说明
颜色 1 出现 2 次,可组成 1 对;颜色 2 出现 2 次,可组成 1 对;颜色 3 出现 2 次,可组成 1 对。合计 3 对。
样例2
输入
5
1 2 3 4 5
输出
0
说明
1、2、3、4、5 各只出现 1 次,均无法配对,合计 0 对。