#P3879. 第1题-整理袜子
-
ID: 3243
Tried: 27
Accepted: 9
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 对。