教学目标
- 公式
, :以 为结点的值是什么 - 本质++不重不漏++集合分类问题
题目: 黑白气球
有一排黑白气球,你可以随机选两个球,问有多少种方法选到颜色不同的球?
- 第一行表示有多个气球
- 0表示白色
- 1表示黑色
6
0 1 1 0 0 1
输出
9
代码
//Author by [Rainboy](https://github.com/rainboylvx)
//date: 2024-05-03 17:22:44
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n,m;
int a[maxn];
int ans;
int main (int argc, char *argv[]) {
std::cin >> n;
for(int i = 1;i <= n ;++i ) // i: 1->n
{
std::cin >> a[i];
}
//枚举以i为结尾
for(int i = 2;i <= n ;++i ) // i: 1->n
{
// 枚举对应的起点
for(int j = 1;j <= i-1 ;++j ) // j: 1->i
{
if( a[j] != a[i])
ans++;
}
}
std::cout << ans << "\n";
return 0;
}
解释
本质这是一个++不重不漏++的集合分类问题
先给每个气球进行编号
0 1 1 0 0 1
1 2 3 4 5 6
那么答案的
| 编号 | 对 |
|---|---|
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 |
证明这是一个集合问题:
原题目部我们: 1. 任何选一对 2. 且这一对的颜色不同
我们一步一步做,任选一对气球,可以得到集合
集合分类
如果我们可以把集合
显然按对数的结尾的数字,可以把集合
证明:
- 不重: 显然以
为结尾的元素不可能和以 为结尾的元素在同一个集合 - 不漏: 任意一个元素一定会以
为结尾
总结
定义: 对数问题
有条件的一对组合(任取两个元素)问题,我们称为对数类问题.
对数类问题的通常解法就是按结尾位置,把集合分类.关键在于如何快速的求取一个子集的数量.
对于对数类问题,对数问题的公式: \sum s(i)
这里用到了集合与分类加法原理
练习题目
暂无题目