目录
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