目录
- T1. 找和为 K 的两个元素
- 思路分析
- T2. Minecraft
- 思路分析
- T3. 踩方格
- 思路分析
- T4. 苹果消消乐
- 思路分析
- T5. 流感传染
- 思路分析
T1. 找和为 K 的两个元素
在一个长度为 n ( n < 1000 ) n\ (n < 1000) n (n<1000) 的整数序列中,判断是否存在某两个元素之和为 k k k。
时间限制:1 s
内存限制:64 MB
- 输入
第一行输入序列的长度 n n n 和 k k k,用空格分开。
第二行输入序列中的 n n n 个整数,用空格分开。 - 输出
如果存在某两个元素的和为 k k k,则输出yes
,否则输出no
。 - 样例输入
9 10 1 2 3 4 5 6 7 8 9
- 样例输出
yes
思路分析
此题考查枚举算法,属于入门题。
常规思路下,用两层循环分别枚举 a i a_i ai 和 a j a_j aj,检测若 a i + a j = k a_i + a_j = k ai+aj=k,则输出 yes
。若在枚举结束仍然没有检测到任何一对元素满足 a i + a j = k a_i + a_j = k ai+aj=k,则输出 no
。
事实上,我们可以将 a a a 序列排序之后,采用双指针技巧做到更快速的枚举。具体来说,设置 i = 1 , j = n i=1,j=n i=1,j=n,
- 若 a i + a j = k a_i + a_j = k ai+aj=k,则输出
yes
,并结束程序; - 若 a i + a j < k a_i + a_j < k ai+aj<k,则将 i i i 向后移动,即
i++
; - 若 a i + a j > k a_i + a_j > k ai+aj>k,则将 j j j 向前移动,即
j--
; - 若 i = j i = j i=j,则枚举过程结束,输出
no
。
/** Name: T1.cpp* Problem: 找和为 K 的两个元素* Author: Teacher Gao.* Date&Time: 2024/11/17 21:58*/#include <cstdio>
#include <algorithm>using namespace std;int main()
{int n, k, a[1005];scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);sort(a + 1, a + n + 1);for (int i = 1, j = n; i < j; ) {if