题目链接
题目描述
旺仔哥哥的衣柜里只有三类衣物:上衣、裤子和鞋子,数量分别为 件。每天出门前,他总会忘记穿一种(可能是上衣、裤子或鞋子)。
若两套穿搭在任意一件衣物的选择上不同,则视为不同的穿搭方案。请你计算,旺仔哥哥在忘穿一件衣物的前提下,一共有多少种不同的穿搭方案。
解题思路
这是一个基础的组合计数问题,可以运用加法原理和乘法原理来解决。问题要求计算在“忘穿一件衣物”的前提下的总穿搭方案数。我们可以将这个前提分解为三个互不相干的独立情况:
-
情况一:忘穿上衣 此时,旺仔哥哥只穿裤子和鞋子。
- 裤子的选择有
种。
- 鞋子的选择有
种。 根据乘法原理,这种情况下的穿搭方案数为
。
- 裤子的选择有
-
情况二:忘穿裤子 此时,旺仔哥哥只穿上衣和鞋子。
- 上衣的选择有
种。
- 鞋子的选择有
种。 根据乘法原理,这种情况下的穿搭方案数为
。
- 上衣的选择有
-
情况三:忘穿鞋子 此时,旺仔哥哥只穿上衣和裤子。
- 上衣的选择有
种。
- 裤子的选择有
种。 根据乘法原理,这种情况下的穿搭方案数为
。
- 上衣的选择有
由于这三种情况是彼此独立的(不可能同时忘穿上衣又忘穿裤子),根据加法原理,总的穿搭方案数就是这三种情况的方案数之和。
因此,总方案数 。
题目包含 组测试用例,我们只需对每一组输入的
执行上述计算即可。
代码
#include <iostream>
using namespace std;
int main() {
int T;
// 读取测试用例数量
cin >> T;
while (T--) {
long long c1, c2, c3;
// 读取三类衣物的数量
cin >> c1 >> c2 >> c3;
// 根据公式计算并输出总方案数
long long ans = c1 * c2 + c1 * c3 + c2 * c3;
cout << ans << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取测试用例数量
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
// 读取三类衣物的数量
long c1 = sc.nextLong();
long c2 = sc.nextLong();
long c3 = sc.nextLong();
// 根据公式计算并输出总方案数
long ans = c1 * c2 + c1 * c3 + c2 * c3;
System.out.println(ans);
}
}
}
# 读取测试用例数量
T = int(input())
for _ in range(T):
# 读取三类衣物的数量
c1, c2, c3 = map(int, input().split())
# 根据公式计算并输出总方案数
ans = c1 * c2 + c1 * c3 + c2 * c3
print(ans)
算法及复杂度
-
算法:数学、组合计数(加法原理、乘法原理)
-
时间复杂度:对于每个测试用例,计算都是
的。总共有
个测试用例,因此总时间复杂度为
。
-
空间复杂度:算法只需要固定的几个变量来存储输入和结果,因此总空间复杂度为
。