51Nod 1001


二分查找,有序数组,相加等于K,必然头尾相加。小于K,说明头过小。大于K,说明尾过大。
1 #include<algorithm> 2 #include<iostream> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 int main(){ 7 int m,n,a[50007],flag=0; 8 scanf("%d%d",&m,&n); 9 for(int i=0;i<n;i++){ 10 scanf("%d",&a[i]); 11 } 12 sort(a,a+n); 13 int i=0,j=n-1; 14 while(i<j){ 15 if(a[i]+a[j]==m){ 16 printf("%d %d\n",a[i++],a[j--]); 17 flag=1; 18 } 19 else if(a[i]+a[j]<m){ 20 i++; 21 } 22 else if(a[i]+a[j]>m){ 23 j--; 24 } 25 } 26 if(flag==0) 27 printf("No Solution\n"); 28 }

浙公网安备 33010602011771号