1244:和为给定数
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 15990 通过数: 5897
【题目描述】
给出若干个整数,询问其中是否有一对数的和等于给定的数。
【输入】
第一行是整数n(0<n≤100,000),表示有n个整数。
第二行是n个整数。整数的范围是在0到108之间。
第三行是一个整数m(0≤m≤230),表示需要得到的和。
【输出】
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No
。
【输入样例】
4
2 5 1 4
6
【输出样例】
1 5
选择有用的就行,没用的可省略…… #include<bits/stdc++.h> using namespace std; #define MAX 100009 int n,m; long long sum=0; long long t=0,a[MAX],b[MAX]; void merge(long long a[],int s,int m,int e) { int pb=0,p1=s,p2=m+1; while(p1<=m&&p2<=e) { if(a[p2]<a[p1]) { b[pb++]=a[p2++]; } else b[pb++]=a[p1++]; } while(p1<=m) b[pb++]=a[p1++]; while(p2<=e) b[pb++]=a[p2++]; for(int i=0;i<=e-s;i++) a[s+i]=b[i]; } void mergesort(long long a[],int s,int e) { if(s<e) { int m=s+(e-s)/2; mergesort(a,s,m); mergesort(a,m+1,e); merge(a,s,m,e); } } long long numsearch(long long a[],int size,long long t) { int l=0,r=size-1; long long lastpos=-1; while(l<=r) { int mid=l+(r-l)/2; if(a[mid]>t) r=mid-1; else { lastpos=mid; l=mid+1; } } return lastpos; } long long p,q,x; double EPS=1e-7; double f(double x){ return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%ld",&a[i]); mergesort(a,0,n-1); long long *p=a,*q=a+n-1; scanf("%ld",&t); for(int i=0;i<n;++i) { if((*p+*q)>t) q--; else if((*p+*q)<t) p++; else break; if(p>q)break; } if(p>q) printf("No"); else printf("%ld %ld",*p,*q); return 0; }