题目链接
题目描述
衣柜里有三类衣物: 件上衣、
条裤子和
双鞋子。每天出门前,总会忘记穿一种(可能是上衣、裤子或鞋子)。若两套穿搭在任意一件衣物的选择上不同,则视为不同的穿搭方案。
请计算,在忘穿一件衣物的前提下,一共有多少种不同的穿搭方案。
输入:
- 第一行输入一个整数
表示测试用例数量。
- 接下来
行,每行输入三个整数
。
输出:
- 对于每个测试用例,在一行上输出不同穿搭方案数量的值。
解题思路
这是一个基础的组合计数问题,可以通过分类讨论和乘法原理、加法原理来解决。
题目要求计算忘穿一件衣物时的总穿搭方案数。忘穿一件衣物共有三种可能情况,这三种情况是互斥的,因此我们可以分别计算每种情况下的方案数,然后将它们相加得到总方案数。
-
情况一:忘记穿上衣
- 此时只穿裤子和鞋子。
- 裤子有
种选择。
- 鞋子有
种选择。
- 根据乘法原理,此情况下的穿搭方案数为
。
-
情况二:忘记穿裤子
- 此时只穿上衣和鞋子。
- 上衣有
种选择。
- 鞋子有
种选择。
- 根据乘法原理,此情况下的穿搭方案数为
。
-
情况三:忘记穿鞋子
- 此时只穿上衣和裤子。
- 上衣有
种选择。
- 裤子有
种选择。
- 根据乘法原理,此情况下的穿搭方案数为
。
根据加法原理,总的穿搭方案数是这三种情况的方案数之和:
总方案数 =
由于 的值可能很大,它们的乘积可能会超出标准32位整数的范围,因此在计算时应使用64位整型(在C++中是
long long
,在Java中是 long
)来存储结果,以防止数据溢出。
代码
#include <iostream>
using namespace std;
using LL = long long;
void solve() {
LL a, b, c;
cin >> a >> b >> c;
LL ans = a * b + a * c + b * c;
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
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();
while (t-- > 0) {
long a = sc.nextLong();
long b = sc.nextLong();
long c = sc.nextLong();
long ans = a * b + a * c + b * c;
System.out.println(ans);
}
}
}
t = int(input())
for _ in range(t):
a, b, c = map(int, input().split())
ans = a * b + a * c + b * c
print(ans)
算法及复杂度
- 算法:数学、组合计数
- 时间复杂度:
,其中
是测试用例的数量。每个测试用例的计算是
。
- 空间复杂度:
,我们只需要常数级别的额外空间来存储变量。