Java combat 16: problema de pago

Java combat 16: problema de pago

Copa Blue Bridge 9a Competición Provincial de Java Grupo A 10.

Título original:
Título: Problema con el pago de facturas

[Descripción del título] Es
común que varias personas salgan a comer juntas. Pero durante el proceso de pago, a menudo surgen algunas disputas.

Ahora hay n personas que comen fuera y han consumido S yuan en total. Entre ellos, la i-ésima persona trajo ai yuan. Afortunadamente, la cantidad total de dinero que todos traen es suficiente para pagar la factura, pero ahora la pregunta es: ¿cuánto paga cada persona?

En aras de la justicia, esperamos que, partiendo de la premisa de que el monto total del pago es exactamente S, la desviación estándar del pago final para todos sea la más pequeña. Aquí estamos de acuerdo en que la cantidad de dinero pagada por cada persona puede ser cualquier número real no negativo, es decir, no puede ser un múltiplo entero de 1 centavo. Debe generar la desviación estándar más pequeña.

Introducción a la desviación estándar: La desviación estándar es la media al cuadrado de la diferencia entre varios números y sus promedios. Generalmente se usa para describir la "cantidad de desviación" entre estos números. Hablando formalmente, suponga que la i-ésima persona paga bi yuan, entonces la desviación estándar s es:
Inserte la descripción de la imagen aquí
[formato de entrada]
leer datos de entrada estándar.
La primera línea contiene dos números enteros n y S, la
segunda línea contiene n números enteros no negativos a1,…, an.

[Formato de salida]
Salida a salida estándar.
Genere la desviación estándar más pequeña, redondeada a 4 lugares decimales.
Asegúrese de que la respuesta correcta no cambie el resultado redondeado después de sumar o restar 10-9 .

[Entrada de la muestra]
5 2 333
666 666 666 666 666

【Salida de muestra】
0.0000

[Ejemplo de explicación]
Todos pagan 2333/5 yuanes, con una desviación estándar de 0.

Otro ejemplo:
[Entrada de muestra]
10 30
2 1 4 7 4 8 3 6 4 7

[Salida de muestra]
0,7928

[Convención de datos]
Para el 10% de los datos, todos los ai son iguales;
para el 30% de los datos, todos los ai distintos de cero son iguales;
para el 60% de los datos, n ≤ 1000;
para el 80% de los datos, n ≤ 10 5 ;
para todos los datos, n ≤ 5 × 10 5 , 0 ≤ ai ≤ 10 9 .

Ideas:

  • Primero calcule la cantidad promedio de dinero directamente dividiendo la cantidad total de dinero por la cantidad de personas. La persona que no es suficiente para pagar la cantidad promedio de dinero, luego calcule la cantidad promedio de dinero que pagan las personas restantes y el persona que no alcanza para entregar todo su dinero, si es suficiente, el restante Cada una de las personas paga una cantidad promedio de dinero.

  • Porque: la desviación estándar se usa para medir el tamaño de la brecha entre los datos.

  • Entonces, esta pregunta adopta este método para minimizar la brecha entre el pago de todos, de modo que se calcule la desviación estándar mínima.

  • Cómo lograr el redondeo: System.out.printf ("%. 4f", s); puede lograr el redondeo.

el código se muestra a continuación:

import java.util.Scanner;
public class province_10 {
    
    
	public static void main(String[] args) {
    
    
		Scanner reader=new Scanner(System.in);
		int n=reader.nextInt();
		double S=reader.nextInt();
		double[] money=new double[n];
		for(int i=0;i<n;i++) {
    
    
			money[i]=reader.nextInt();
		}
		//排序
		double t;
		for(int i=0;i<n-1;i++) {
    
    
			for(int j=0;j<n-1;j++) {
    
    
				if(money[j]>money[j+1]) {
    
    
					t=money[j];
					money[j]=money[j+1];
					money[j+1]=t;
				}
			}
		}
		
		//计算每个人花多少钱
		double min=money[0];
		double a[]=new double[n];//存每人实际付钱数
		int ans=0;//计数,计有几人钱不够
		double left=S;
		for(int i=0;i<n-1;i++) {
    
    
			if(left/(n-ans)>min) {
    
    
				a[i]=min;//a[0]=300//a[1]=467
				left=left-min;//left=2033//left=1566
				min=money[i+1];//min=467//min=600
				ans++;//ans=1ans=2
			}
			else {
    
    
				for(int j=ans;j<n;j++){
    
    //j=2//j=3//j=4
					a[j]=left/(n-ans);//a[2]=522//a[3]=522//a[4]=522
				}
			}
		}
		
		//计算标准差
		double aver=S/n;double sum=0;
		for(int i=0;i<n;i++) {
    
    
			sum+=(a[i]-aver)*(a[i]-aver);
		}
		double s=Math.sqrt(sum/n);//开方的方法
		System.out.printf("%.4f",s);
	}
}

/*
5 2333
666 666 666 666 666

*/

/*
10 30
2 1 4 7 4 8 3 6 4 7

*/

El primer conjunto de resultados de datos de prueba:
Inserte la descripción de la imagen aquí

El segundo conjunto de resultados de datos de prueba:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_46020391/article/details/112689056
Recomendado
Clasificación