C - 牛配对
问题描述
快到交配的季节了,Alice要准备为牧场里的牛进行配对。为了保证遗传性状的优良,不能随便找两头牛进行配对,要满足一定的条件。根据对牛的一系列遗传学分析,给每头牛计算出遗传特征的关键字编号,有些牛的是同一个品种并且性状一致,所以牛的特征编号可能重复。如果两头牛的编号之和恰为K,那么从遗传学的理论的视角看,这两头牛进行配对结果将是最优的,Alice就要把这两头牛挑出来放在一个畜栏中准备为它们配对。现在告诉你所有牛的编号和数字K,请你帮Alice找出一对可以配对的牛。
Input
输入有3行,第一行一个正整数N表示共有N头牛,第二行有N个数字,分别表示各牛的编号,第三行一个正整数K。
- 0 < N ≤ 100000
- 牛的编号是[0,108]之间的整数
- 0≤K≤230
Output
对于数字K,如果能找到两头牛的编号之和是K,就在一行中输出这两头牛的编号,小的在前,大的在后,中间用一个空格分隔。若有多对牛都满足条件,则只输出较小编号更小的那两头牛。若找不到合适的牛,就在一行中输出No
Sample Input
4 2 5 1 4 6
Sample Output
1 5
C++能过,JAVA超时严重
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long arr[] = new long[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
long k = sc.nextInt();
Arrays.sort(arr);
long a,b;
int l,r,mid;
for (int i = 0; i < arr.length; i++) {
a = arr[i];
if(a>k) {
break;
}
// for (int j = arr.length-1; j >i; j--) {
// if(a+arr[j]<k) {
// break;
// }
// if(a+arr[j]==k) {
// System.out.println(a+" "+arr[j]);
// return;
// }
// }
b = k-a;
l=i;
r=arr.length-1;
while(l<=r) {
mid = (l+r)/2;
if(arr[mid]==b) {
System.out.println(a+" "+arr[mid]);
return;
}else if(arr[mid]<b) {
l=mid+1;
}else {
r=mid;
}
}
}
System.out.println("No");
}
}
#include <cstdio>
#include <algorithm>
using std::sort;
using std::binary_search;
int main(void)
{
int *a,i,N,K;
scanf("%d",&N);
a=new int [N];
for (i=0;i<N;i++)
scanf("%d",a+i);
sort(a,a+N);
scanf("%d",&K);
for(i=0;i<N-1;i++)
{
if(binary_search(a+i+1,a+N,K-a[i]))
{
printf("%d %d\n",a[i],K-a[i]);
break;
}
}
if(i==N-1)
printf("No\n");
delete [] a;
return 0;
}
Wrong:
#include <cstdio>
#include <algorithm>
using std::sort;
int main(void)
{
int *a,i,j,N,K;
scanf("%d",&N);
a=new int [N];
for (i=0;i<N;i++)
scanf("%d",a+i);
sort(a,a+N);
scanf("%d",&K);
for(i=0;i<N-1;i++)
{
if(a[i]>K)
break;
for (j = N-1; j >i; j--)
{
if(a[i]+a[j]<K)
break;
if(a[i]+a[j]==K)
{
printf("%d %d\n",a[i],K-a[i]);
return 0;
}
}
}
if(i==N-1)
printf("No\n");
delete [] a;
return 0;
}