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;
    }
    

      

  • 相关阅读:
    Minimum configuration for openldap to proxy multiple AD into a single search base
    排列组合算法(PHP)
    Make Notepad++ auto close HTML/XML tags after the slash(the Dreamweaver way)
    PHP, LDAPS and Apache
    【day1】tensorflow版本问题及初步使用
    tflearn save模型异常
    布隆过滤器(Bloom Filter)
    初识Spark(Spark系列)
    Hadoop实践
    install postgis(2.0) on ubuntu(12.04)
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5709528.html
Copyright © 2011-2022 走看看