目录
- T1. 我家的门牌号
- 思路分析
- T2. 子串计算
- 思路分析
- T3. 吃糖果
- 思路分析
- T4. 拨钟问题
- 思路分析
- T5. 分形盒
- 思路分析
T1. 我家的门牌号
我家住在一条短胡同里,这条胡同的门牌号从 1 1 1 开始顺序编号。
若所有的门牌号之和减去我家门牌号的两倍,恰好等于 n n n,求我家的门牌号及总共有多少家。
数据保证有唯一解。
时间限制:1 s
内存限制:64 MB
- 输入
一个正整数 n n n。 n < 100000 n < 100000 n<100000。 - 输出
一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。 - 样例输入
100
- 样例输出
10 15
思路分析
此题考查枚举法,属于入门题。这里提供两种比较简单,容易实现的方法,更详细的解析见【青少年软编等考 2021-12 三级】我家的门牌号这篇文章。
根据题意,我们可以列出方程 t o t a l × ( t o t a l + 1 ) 2 − 2 × m y _ h o m e = n \frac{total\times (total+1)}{2} - 2\times my\_home = n 2total×(total+1)−2×my_home=n,其中 t o t a l total total 表示总户数, m y _ h o m e my\_home my_home 表示我家门牌号。
于是我们可以用双重循环枚举求解此题,由于 m y _ h o m e my\_home my_home 受到 t o t a l total total 的限制,因此外层循环枚举 t o t a l total total,内层循环枚举 m y _ h o m e my\_home my_home,更易于验证。
/** Name: T1_1.cpp* Problem: 我家的门牌号* Author: Teacher Gao.* Date&Time: 2024/11/19 20:44*/#include <iostream>using namespace std;int main()
{int n;cin >> n;for (int total = 1; ; total++) {for (int my_home = 1; my_home <= total; my_home++) {int sum = total * (total + 1) / 2;if (sum - 2 * my_home == n) {cout << my_home << " " << total << endl;return 0;}}}return 0;
}
事实上,对于两个未知数,一个等式的不定方程,我们可以将方程中的未知数分开两边: t o t a l × ( t o t a l + 1 ) 2 − n = 2 × m y _ h o m e \frac{total\times (total+1)}{2} - n = 2\times my\_home 2total×(total+1)−n=2×my_home,利用等式的性质,用单层循环枚举可解。
具体来说,等式右边应满足 2 ≤ 2 × m y _ h o m e ≤ 2 × t o t a l 2 \le 2 \times my\_home \le 2\times total 2≤2×my_home≤2×total,并且 m y _ h o m e my\_home my_home 为整数,因为题目数据保证有唯一解,于是只要方程左边满足上述条件即为答案。
/** Name: T1_2.cpp* Problem: 我家的门牌号* Author: Teacher Gao.* Date&Time: 2024/11/19 20:46*/#include <iostream>using namespace std;int main()
{int n;cin >> n;for (int total = 1; ; total++) {int t = total * (total + 1) / 2 - n;if (2 <= t && t <= 2 * total && t % 2 == 0) {int my_home = t / 2;<