[JAVA] ABC --027 --A & B & C

AtCoder ABC 027 A&B&C AtCoder - 027

Un problème

«Des trois nombres, deux sont identiques mais un est différent. Trouvez-en un autre. ――Je veux jouer à deux pour en faire un ――Lorsque vous XOR, les choses qui n'ont pas pu être annulées restent

	private void solveA() {
		int wk = IntStream.range(0, 3).map(i -> nextInt()).reduce(0, (sum, i) -> sum ^ i);
		out.println(wk);
	}

Problème A: flux forcé

―― Quelque chose de Bimyo ――En premier lieu

Diffusion difficile

	private void solveA2() {
		int[] wk = IntStream.range(0, 3).map(i -> nextInt()).toArray();
		Map<Integer, Long> resA = Arrays.stream(wk).mapToObj(i -> new Integer(i))
				.collect(Collectors.groupingBy(i -> i, Collectors.counting()));

		List<Entry<Integer, Long>> res = resA.entrySet().stream().filter(i -> i.getValue() != 2)
				.collect(Collectors.toList());
		//		Optional<Entry<Integer, Long>> res = resA.entrySet().stream().filter(i -> i.getValue() != 2).findFirst();
		out.println(res.get(0).getKey());
	}

Problème B

--Image de personnes qui coulent

i 1 pont 2 pont 3 pont 4 pont 5 Nombre moyen de personnes
0 5 - 10 3
1 3 - 2 - 10 3
2 3 - 2 - - 10 3
3 3 - 2 - - - 10 3
4 3 - 3 - 3 - 3 - 3 3
i 1 pont 2 pont 3 pont 4 pont 5 Nombre moyen de personnes
0 - 10 5 3
1 3 - 7 - 5 3
2 3 - 3 - 9 - 3
3 3 - 3 - 3 - 6 - 3
4 3 - 3 - 3 - 3 - 3 3

«La nécessité ou non d'un pont est jugée uniquement par« si le nombre de personnes d'un côté est le même que la moyenne de l'île x ».

Dans la figure ci-dessous, si vous construisez un pont entre 1 et 3, 1 à 3 est devenu la moyenne.

i 1 pont 2 pont 3 pont 4 pont 5 Nombre moyen de personnes
0 - 9 3 3 3
1 3 - 6 - 3 3 3
2 3 - 3 - 3 3 3 3

Dans cet exemple, vous devez également construire un pont pour 4-5. ――Lorsque vous regardez à gauche du pont 4-5, c'est (3 × 4 ―― 9! = 0).

i 1 pont 2 pont 3 pont 4 pont 5 Nombre moyen de personnes
0 - 9 6 3
1 3 - 6 - 6 3
2 3 - 3 - 3 - 6 3
3 3 - 3 - 3 3 - 3 3
	private void solveB() {
		int numN = nextInt();
		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();
		int sum = Arrays.stream(wk).sum();
		if (sum == 0) {
			out.println(0);
			return;
		}
		if (sum % numN != 0) {
			out.println(-1);
			return;
		}

		int avg = sum / numN;
		int cnt = 0;

		/*Jusqu'à présent, les deux méthodes de mise en œuvre sont les mêmes*/

		//------------------------------------------------------------------------
		/*
		 *Version de somme cumulée
		 */
		int[] forW = new int[numN];
		for (int i = 0; i < numN; i++) {
			if (i == 0) {
				forW[i] = wk[i];
			} else {
				forW[i] += forW[i - 1] + wk[i];
			}

		}
		/*
		 *Initialement 0(i-1)À partir de 1(i)Avez-vous besoin d'un pont?
		 *  ->Alors, partez de 1. La valeur maximale du pont est N-1 donc 0(or N)L'un ou l'autre n'est pas applicable
		 *nécessaire-> 0(i-1)La population au point est différente de la valeur moyenne (peu importe qu'elle soit grande ou petite)
		 *Inutile-> 0(i-1)La population au point est la même que la valeur moyenne
		 *
		 * i-Si un pont est nécessaire de 1 à i
		 *nécessaire-> sum(i-1)Quand,(i-1)*La valeur moyenne est différente (peu importe si elle est plus ou moins)
		 *Inutile-> sum(i-1)Quand,(i-1)*Même valeur moyenne
		 */
		for (int i = 1; i < numN; i++) {
			if (forW[i - 1] != i * avg) {
				cnt++;
			}
		}
		//------------------------------------------------------------------------
		/*
		 *Version d'implémentation stupide
		 */
		//		for (int i = 1; i < numN; i++) {
		//			int sumLeft = 0;
		//			for (int j = 0; j < i; j++) {
		//				sumLeft += wk[j];
		//			}
		//			int sumRight = 0;
		//			for (int j = i; j < numN; j++) {
		//				sumRight += wk[j];
		//			}
		//			if (sumLeft != i * avg || sumRight != (numN - i) * avg) {
		//				cnt++;
		//			}
		//		}
		//------------------------------------------------------------------------
		out.println(cnt);
	}

Problème C

«Je ne pourrais pas comprendre sans voir la solution. Je ne sais toujours que d'une manière ou d'une autre. «Je peux l'illustrer, mais je ne peux pas l'expliquer avec des mots. .. ..

	private void solveC() {
		long numN = nextLong();

		/*
		 *Examiner la profondeur
		 */
		int depthCnt = 0;
		for (long n = numN; n > 0; n >>= 1) {
			depthCnt++;
		}

		long cnt = 1;

		/*
		 *Si la profondeur est égale[ 2*n ]Commencer à partir de
		 *Si la profondeur est bizarre[ 2*n+1 ]Commencer à partir de
		 */
		int adjust = depthCnt % 2;
		/*
		 *Aoki gagne si le premier numéro ne peut pas être compté
		 *Après ça,
		 *Takahashi gagne si Aoki ne peut pas compter
		 *Aoki gagne si Takahashi ne peut pas compter
		 *Répétez jusqu'à ce que vous gagniez en alternance.
		 *Peut-être que je devrais répéter à MAX of Long, mais je ne suis pas sûr
		 */
		boolean who = true;
		while (true) {
			cnt = 2 * cnt + adjust;
			if (cnt > numN) {
				out.println(who ? "Aoki" : "Takahashi");
				return;
			}
			who = !who;
			adjust = 1 - adjust;

		}

	}

Recommended Posts

ABC --013-A et B et C
ABC --023 --A & B & C
ABC --036-A et B et C
ABC --010 --A & B & C
ABC --028 --A & B & C
ABC --128 --A & B & C
ABC --012-A et B et C
ABC --018 --A & B & C
ABC --054 --A & B & C
ABC --017 --A & B & C
ABC --029- A & B & C
ABC --022 --A & B & C
ABC --019 --A & B & C
ABC --020 --A & B & C
ABC --030- A & B & C
ABC --127 --A & B & C
ABC --132- A & B & C
ABC --026 --A & B & C
ABC --014- A & B & C
ABC --016 --A & B & C
ABC --011-A et B et C
ABC --031 --A & B & C
ABC --025 --A & B & C
ABC --024 --A & B & C
ABC --027 --A & B & C
ABC --080- A & B & C
ABC --129- A & B & C & D
ABC --133- A & B & C & D
ABC --125- A & B & C & D
ABC --130- A & B & C & D
ABC --126 --A & B & C & D
ABC --134- A & B & C & D & E
ABC --131- A & B & C & D & E
Concours de programmation diverta 2019 A & B & C & D
AtCoder Beginner Contest 169 A, B, C avec rubis
Problème atcoder ABC113 C
ABC093 C - Mêmes entiers
problème atcoder ABC115 C
AtCoder Beginner Contest 170 A, B, C jusqu'au rubis
Une personne écrivant C ++ a essayé d'écrire Java
Faire un appel SOAP en C #
Appeler les fonctions du langage C depuis Swift