原题链接:信息学奥赛一本通T1244-和为给定数
(# 现成的STL直接逮住用
要想了解更多关于lower_bound/upper_bound -> 【C++函数速查】lower_bound和upper_bound使用方法详细解读
Vector版
#include<bits/stdc++.h>
#define ULL unsigned long long
#define LL long long
#define endl '\n'
#define debug(a) cout<<#a<<"="<<a<<endl;
#define PII pair<int,int>
using namespace std;
const int N = 1 *1e7 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
int n,m;
int find(int x,vector<int> a)
{
return lower_bound(a.begin(),a.end(),x) - a.begin();
}
void solve()
{
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++) cin>>arr[i];
cin>>m;
sort(arr.begin(),arr.end());
// 1 2 4 5
for(auto x : arr)
{
int t = m - x; //求出要找出的数
int i = find(t,arr); //找到第一个大于等于t的下标
if(arr[i] == t && arr[i] != x) //该下标的数是等于t并且不是自己
{
cout<<x<<' '<<t;
exit(0);
}
}
cout<<"No"<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(0);
int _=1;
// cin>>_;
while(_--)
{
solve();
}
return 0;
}
/**
* author: Nijika_jia
* created: 2024.10.12 23:02:03
*/
常规数组版
#include<bits/stdc++.h>
#define ULL unsigned long long
#define LL long long
#define endl '\n'
#define debug(a) cout<<#a<<"="<<a<<endl;
#define PII pair<int,int>
using namespace std;
const int N = 1 *1e7 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
int n,m;
int arr[N];
int find(int x,int a[])
{
return lower_bound(a,a+n,x) - a;
}
void solve()
{
cin>>n;
for(int i=0;i<n;i++) cin>>arr[i];
cin>>m;
// 1 2 4 5
sort(arr,arr+n);
for(int i=0;i<n;i++)
{
int t = m - arr[i]; //求出要找出的数
int j = find(t,arr); //找到第一个大于等于t的下标
if(arr[j] == t && arr[j] != arr[i]) //该下标的数是等于t并且不是自己
{
cout<<arr[i]<<' '<<t;
exit(0);
}
}
cout<<"No"<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(0);
int _=1;
// cin>>_;
while(_--)
{
solve();
}
return 0;
}
/**
* author: Nijika_jia
* created: 2024.10.12 23:02:03
*/
手写二分版
#include<bits/stdc++.h>
#define ULL unsigned long long
#define LL long long
#define endl '\n'
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(v) v.begin(), v.end()
#define PII pair<int,int>
using namespace std;
const int N = 1 *1e6 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
int n,m;
int a[N];
int find(int x)
{
int l = 0 , r = n;
while (l < r)
{
int mid = l + r >> 1;
if(a[mid] == x) return mid;
if(a[mid] < x) l = mid+1;
else r = mid;
}
return l;
}
void solve()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
cin>>m;
sort(a,a+n);
for(int i=0;i<n;i++)
{
int t = m - a[i];
int j = find(t);
if(a[j] != a[i] && a[j] == t)
{
cout<<a[i]<<' '<<a[j];
exit(0);
}
}
cout<<"No"<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(nullptr);
int _=1;
// cin>>_;
while(_--)
{
solve();
}
return 0;
}
/**
* author: Nijika_jia
* created: 2024.10.16 22:52:32
*/
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复