zoukankan      html  css  js  c++  java
  • ACM: 限时训练题解-Runtime Error-二分查找

    1. Runtime Error

     

    Bahosain was trying to solve this simple problem, but he got a Runtime Error on one of the test cases, can you help him by solving it?

    Given an array of N non-negative integers and an integer K, your task is to find two integers X and Y from the given array such that X × Y = K.

    The chosen numbers must have different indices in the   array.

    Input

     

    The first line of input contains T (1 ≤ T ≤ 128), the number of test   cases.

    The first line of each test case contains two integers: N (2 ≤ N ≤ 100,000) and K (1 ≤ K ≤ 100,000). The next line contains N space-separated integers, each between 0 and   100,000.

    Output

     

    For each test case, if there is no solution, print -1 on a single line. Otherwise print a single line with two space-separated integers X Y (X ≤   Y), where X and Y are two numbers from the given array and X × Y = K.

    If there is more than one possible solution, print the one with the minimum   X.

    Sample Input

    Sample Output

    4

    2 6

    6 12

    -1

    3 6 2

    4 2

    9

    3 12

    2 1

    1 12

    1 2

    4 36

    12 18

    3 36

    4 12

    1 2 6

    12

    /*
    题意:
    从给出的N个数中找出两个数,乘积为 K;
    
    枚举x 二分搜索 y  
    */ 
    
    #include"iostream"
    #include"algorithm"
    #include"cstdio"
    #include"cstring"
    #include"cmath"
    #define MX 100000 + 50
    using namespace std;
    
    int a[MX];
    
    int main() {
    	int T,k,n;
    	scanf("%d",&T);
    	while(T--) {
    		scanf("%d%d",&n,&k);
    		for(int i=0; i<n; i++) {
    			scanf("%d",&a[i]);
    		}
    		sort(a,a+n);
    		int ans1=0,ans=0;
    		for(int i=0; i<n-1; i++) {
    			ans1=i;
    			
    			int l=i+1,r=n-1,mid;
    			while(l<=r) {
    				mid=(r+l)/2;
    				if(a[i]*a[mid]>k) {
    					r=mid-1;
    				} else if(a[i]*a[mid]<k) {
    					l=mid+1;
    				} else if(a[i]*a[mid]==k){
    					ans=mid;
    					break;
    				}
    			}
    			if(ans)break;
    			
    		}
    		if(ans)
    			printf("%d %d
    ",a[ans1],a[ans]);
    		else printf("-1
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Linux下GCC的使用
    Hadoop c++开发
    如何区别PeekMessage&GetMessage SendMessage&PostMessage
    二叉树的三种遍历方式的循环和递归的实现方式
    各种排序算法的代码
    各种排序算法的总结
    EAX、ECX、EDX、EBX寄存器的作用
    浮点型在内存当中的存储方式
    error LNK2001: 无法解析的外部符号
    线程通信
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5709528.html
Copyright © 2011-2022 走看看