PAT A1048 Find Coins (25 puntos) - implementación de búsqueda binaria

A Eva le encanta coleccionar monedas de todo el universo, incluidos algunos otros planetas como Marte. Un día visitó un centro comercial universal que podía aceptar todo tipo de monedas como pago. Sin embargo, había un requisito especial de pago: por cada billete, solo podía usar exactamente dos monedas para pagar la cantidad exacta. Como tiene hasta 10 5 monedas con ella, definitivamente necesita tu ayuda. Se supone que debes decirle, por cualquier cantidad de dinero dada, si puede o no encontrar dos monedas para pagarla.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene 2 números positivos: N (≤10 5 , el número total de monedas) y M (≤10 ​3 , la cantidad de dinero que tiene que pagar Eva). La segunda línea contiene N valores nominales de las monedas, que son todos números positivos de no más de 500. Todos los números en una línea están separados por un espacio.

Especificación de salida:

Para cada caso de prueba, imprima en una línea los dos valores faciales V 1 y V 2 (separados por un espacio) tales que V 1 +V 2 =M y V 1 ≤V 2 . Si tal solución no es única, genere la que tenga el V 1 más pequeño . Si no hay solución, en su lugar, envíe Sin solución.

Ejemplo de entrada 1:

8 15
1 2 8 7 2 4 11 15

Salida de muestra 1:

4 11

Ejemplo de entrada 2:

7 14
1 8 7 2 4 11 15

Salida de muestra 2:

Sin solución

Significado del título:

Ingrese el número de monedas N y el precio de la mercancía M en la primera línea, e ingrese la denominación de cada moneda en la segunda línea; emita las denominaciones V 1 y V 2 de dos monedas cuya suma de denominación es M, y requiere V 1 <= V 2 , si la salida es el resultado No único, genera el grupo con el valor V 1 más pequeño, si no hay ningún resultado que cumpla la condición, genera Sin solución.

Ideas:

(1) Diseñe una función de búsqueda binaria cuyos parámetros sean el arreglo a[], el límite inferior izquierdo, el límite superior derecho y el entero x a buscar, averigüe si hay un elemento a[i] igual a x en el matriz a, y salida si existe tal elemento i, de lo contrario, salida -1;
(2) La matriz a debe ordenarse de manera no decreciente antes de usar la función de búsqueda binaria.

código:

#include <cstdio>
#include <algorithm>
using namespace std;

int binarySearch(int a[],int left,int right,int x){
    
    //二分查找,找出数组a中是否存在等于x的元素a[i],如果存在这个元素则输出i,否则输出-1 
	int mid;
	while(left<=right){
    
    
		mid = (left+right)/2;
		if(a[mid]==x) return mid;
		else if(a[mid]>x) right = mid-1;
		else left = mid+1;
	}
	return -1;
} 

int main(){
    
    
	int N,M;
	scanf("%d %d",&N,&M);
	int V[N];
	for(int i=0;i<N;i++){
    
    
		scanf("%d",&V[i]);
	}
	sort(V,V+N);//非递减排序
	for(int i=0;i<N;i++){
    
    
		int j = binarySearch(V,i+1,N-1,M-V[i]);//因为数组V非递减,且题目要求V[i]<=V[j],所以将下界设为i+1
		if(j!=-1){
    
    
			printf("%d %d\n",V[i],V[j]);
			return 0;
		}
	}
	printf("No Solution\n");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/PanYiAn9/article/details/104650617
Recomendado
Clasificación