题解 P7566 「MCOI-05」饱食
读题可以发现:答案只和首字母是 M
,C
,O
和 I
的数量有关。
那么可以分别统计首字母是 M
,C
,O
和 I
的编号的数量,设数量分别为 \(a,b,c,d\) 。
- 若分别选三个首字母是
M
,C
,O
的编号,由组合数学的排列的问题可以知道,数量是 \(a \times b \times c\) 。 - 若分别选三个首字母是
M
,C
,I
的编号,由组合数学的排列的问题可以知道,数量是 \(a \times b \times d\) 。 - 若分别选三个首字母是
M
,O
,I
的编号,由组合数学的排列的问题可以知道,数量是 \(a \times c \times d\) 。 - 若分别选三个首字母是
C
,O
,I
的编号,由组合数学的排列的问题可以知道,数量是 \(b \times c \times d\) 。
最终的答案是上面三种情况的和。
代码如下:
#include <iostream>
#include <string>
typedef long long LL;
using namespace std;
string s;
LL a ,b ,c ,d ,ans; int n;
//为了防止乘法的时候爆 long long 就全部定义为 long long 了
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s;
if (s[0] == 'M') a++;
else if (s[0] == 'C') b++;
else if (s[0] == 'O') c++;
else if (s[0] == 'I') d++;
}
cout << a * b * c + a * b * d + a * c * d + b * c * d << endl;
return 0;
}