Java Combat 16: problème de paiement

Java Combat 16: problème de paiement

Blue Bridge Cup 9e Compétition provinciale de Java Groupe A 10.

Titre original:
Titre: Problème de paiement de factures

[Description du titre] Il
est courant que plusieurs personnes sortent pour manger ensemble. Mais lors de la commande, il y a souvent des différends.

Maintenant, il y a n personnes qui mangent au restaurant et elles ont consommé S yuan au total. Parmi eux, la i-ème personne a apporté un yuan. Heureusement, le montant total que chacun apporte est suffisant pour payer la facture, mais maintenant la question est: combien chaque personne paie-t-elle?

Par souci d'équité, nous espérons que, dans l'hypothèse où le montant total du paiement est exactement S, l'écart type du paiement final pour tout le monde est le plus petit. Ici, nous convenons que le montant d'argent payé par chaque personne peut être n'importe quel nombre réel non négatif, c'est-à-dire qu'il ne peut pas être un multiple entier de 1 cent. Vous devez produire le plus petit écart type.

Introduction à l'écart-type: L'écart-type est la moyenne au carré de la différence entre plusieurs nombres et leurs moyennes. Il est généralement utilisé pour décrire «l'écart» entre ces nombres. Formellement parlant, supposons que la i-ème personne paie bi yuans, alors l'écart type s est:
Insérez la description de l'image ici
[format d'entrée]
lire les données à partir de l'entrée standard.
La première ligne contient deux entiers n et S, la
deuxième ligne contient n entiers non négatifs a1,…, an.

[Format de sortie]
Sortie vers la sortie standard.
Affiche le plus petit écart type, arrondi à 4 décimales.
Assurez-vous que la bonne réponse ne changera pas le résultat arrondi après avoir ajouté ou soustrait 10-9 .

[Exemple d'entrée]
5 2333
666 666 666 666 666

【Exemple de sortie】
0,0000

[Exemple d'explication]
Tout le monde paie 2333/5 yuans, avec un écart type de 0.

Autre exemple:
[Exemple d'entrée]
10 30
2 1 4 7 4 8 3 6 4 7

[Exemple de sortie]
0,7928

[Convention sur les données]
Pour 10% des données, tous les ai sont égaux;
pour 30% des données, tous les ai non nuls sont égaux;
pour 60% des données, n ≤ 1000;
pour 80% des données, n ≤ 10 5 ;
pour toutes les données, n ≤ 5 × 10 5 , 0 ≤ ai ≤ 10 9 .

Idées:

  • Calculez d'abord le montant moyen directement en divisant le montant total par le nombre de personnes. La personne qui ne suffit pas pour payer le montant moyen, puis calculez le montant moyen que les autres personnes paient, et le personne qui ne suffit pas de remettre tout son argent, si assez, le reste Chacun des gens paie une somme d'argent moyenne.

  • Parce que: l'écart type est utilisé pour mesurer la taille de l'écart entre les données.

  • Cette question adopte donc cette méthode pour minimiser l'écart entre les paiements de chacun, de sorte que l'écart type minimum soit calculé.

  • Comment obtenir un arrondi: System.out.printf ("%. 4f", s); peut réaliser un arrondi.

code montrer comme ci-dessous:

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

*/

Le premier ensemble de résultats de données de test:
Insérez la description de l'image ici

Le deuxième ensemble de résultats de données de test:
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46020391/article/details/112689056
conseillé
Classement