• 51Nod 1001 数组中和等于K的数对


    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1001
    一开始的想法是排序后二分搜索,发现会进行非常多不必要的遍历,十分耗时间。
    解决方法:在得到一对数之后顺便令数组长度进行缩短能够有效减少运行时间。

    1
    #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 //int bs(int key,int num,int i,int n[],int sum); 5 6 int main() 7 { 8 int sum,num; 9 cin >> sum >> num; 10 int n[num]; 11 for(int i=0; i<num; i++) 12 { 13 cin >> n[i]; 14 } 15 sort(n,n+num); 16 int left = 0; 17 int f=0; 18 int right = num-1; 19 while(left < right) 20 { 21 if((sum-n[left])==n[right]) 22 { 23 f=1; 24 cout << n[left] << ' ' << sum - n[left] << endl; 25 right--; 26 left++; 27 } 28 else if((sum-n[left])>n[right]) 29 { 30 left++; 31 } 32 else if((sum-n[left])<n[right]) 33 { 34 right--; 35 } 36 } 37 38 39 40 // t=bs(n[i],num,i,n,sum); 41 // if(t) 42 // { 43 // cout << n[i] << ' ' << sum - n[i] << endl; 44 // } 45 46 // for(int i=0;res[i][1]!=0&&(res[i][1]!=res[i][0]);i++) 47 // { 48 // cout << res[i][0] << ' ' << res[i][1] << endl; 49 // f=1; 50 // } 51 if(f==0) 52 cout << "No Solution"; 53 return 0; 54 } 55 56 //int bs(int key,int num,int left,int n[],int sum) 57 //{ 58 // int right = num; 59 // int mid; 60 // while(left < right) 61 // { 62 // mid = (left + right) / 2; 63 // if((sum-key)==n[mid]) 64 // return n[mid]; 65 // else if((sum-key)>n[mid]) 66 // left = mid; 67 // else if((sum-key)<n[mid]) 68 // right = mid; 69 // } 70 // 71 // return 0; 72 //}

     

  • 相关阅读:
    hdu5587 BestCoder Round #64 (div.2)
    hdu5569 BestCoder Round #63 (div.2)
    hihocoder1257(构造)(2015北京ACM/ICPC)
    hihocoder 1249(2015ACM/ICPC北京)
    hihocoder1258(水)(2015ACM/ICPC北京站)
    hihiocoder 1255(搜索)(2015ACM/ICPC北京站)
    习题9-8 uva1631
    习题9-8 Uva1632
    Orz
    习题9-6 uva 10723
  • 原文地址:https://www.cnblogs.com/tornado549/p/8724279.html
Copyright © 2020-2023  润新知