和为给定数(信息学奥赛一本通-T1244)

本文介绍了一种高效的算法,用于解决给定一系列整数中是否存在两个数的和等于特定值的问题。通过先排序再使用双指针技术,可以在较短时间内找到符合条件的整数对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】

给出若干个整数,询问其中是否有一对数的和等于给定的数。

【输入】

第一行是整数n(0 < n ≤ 100,000),表示有n个整数。

第二行是n个整数。整数的范围是在0到108之间。

第三行是一个整数m(0≤m≤230),表示需要得到的和。

【输出】

若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。

【输入样例】

4
2 5 1 4
6

【输出样例】

1 5

【源程序】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#define INF 999999999
#define N 1000001
#define MOD 1000000007
#define E 1e-3
using namespace std;
int a[N];
int main()
{
    long long n,m,i,j;
    int tot=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    cin>>m;
    sort(a+1,a+1+n);
    i=1;j=n;
    while(i<j)
    {
        if(a[i]+a[j]==m)
        {
            cout<<a[i]<<" "<<a[j]<<endl;
            exit(0);
        }
        else if(a[i]+a[j]<m)
            i++;
        else
            j--;
    }
    cout<<"No"<<endl;
    return 0;
}

 

### 关于信息学奥赛一本全书的AC代码及解析 #### 题目概述 信息学奥赛一本一本面向编程竞赛的学习资料,涵盖了多种算法据结构的应用。书中提供了大量的练习题,并过在线评测系统验证解答的正确性。 #### 解析与实现方法 对于给定的任务,即找到具有特定属性的新值,在此提供一种用策略来处理这类问题: 当面对需要转换成其他进制(如二进制)并比较位模式的情况时,可以采用枚举法或更高效的预计算方式。例如,针对题目描述中的需求——找出比给定大且含有相同比特'1'量的第一个整[M][^3],可以过以下步骤解决这个问题: - **初始化变量**:设定初始条件,准备循环迭代。 - **遍历候选者**:从`N+1`开始逐个检查更大的自然直到满足条件为止。 - **计器对比**:利用内置函或其他手段统计当前测试对象中'1'的量并与原始输入做匹配检验。 - **返回结果**:一旦发现符合条件的结果立即停止搜索过程并将该值作为最终输出。 下面给出一段基于上述逻辑框架的具体编码实例(C++)用于演示如何完成这项工作: ```cpp #include <iostream> using namespace std; // 计算n的二进制表示中含有多少个‘1’ int countBits(int n){ int cnt = 0; while (n != 0) { ++cnt; n &= (n - 1); // 清除最低位的1 } return cnt; } bool hasSameNumberOfOnes(int a, int b){ return countBits(a)==countBits(b); } void findNextNumberWithEqualOneCount(){ int N,M; cin>>N; M=N+1; while(!hasSameNumberOfOnes(N,M)){ ++M; } cout<<M<<"\n"; } ``` 这段程序实现了寻找下一个拥有相同比特'1'目整的功能。它首先定义了一个辅助功能`countBits()`用来获取任意非负整在其二进制形式下的'1'总;接着创建另一个布尔型判定子例程`hasSameNumberOfOnes()`, 它接收两个参并对它们各自的'1'位进行比较;最后主流程部分则负责读取用户提供的起始点`N`并过不断递增的方式尝试定位到目标位置`M`. 需要注意的是,实际参赛过程中应当依据具体比赛平台的要求调整输入/输出格式以及可能存在的边界情况处理机制。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值