【2020.10.14 广联达java笔试】跳舞机、元素平衡(27%)、一种排序

package top.actim.test09;

import java.util.Arrays;
import java.util.Scanner;

public class GLD {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		// dance();
		// eleBalance();
		sort();
	}

	/**
	 * 有一种排序算法定义如下,该排序算法每次把一个元素提到序列的开头,例如2, 1, 3, 4,只需要一次操作把1提到序列起始位置就可以使得原序列从小到大有序。
	 * 现在给你个乱序的1-n的排列,请你计算最少需要多少次操作才可以使得原序列从小到大有序。
	 */
	static void sort() {
		// 输入第一行包含两个正整数n,表示序列的长度。(1 <= n <= 100000)接下来一行有n个正整数,表示序列中的n个元素,中间用空格隔开。
		// (1 <=a_i <= n)
		// 输出仅包含一个整数,表示最少的操作次数。
		// 样例输入:
		//		4
		//		2 1 3 4
		// 样例输出:
		//		1
		int n = sc.nextInt();
		int[] temp = new int[n];
		int[] targ = new int[n];
		for (int i = 0; i < temp.length; i++) {
			temp[i] = sc.nextInt();
			targ[i] = temp[i];
		}

		Arrays.sort(targ);

		int p = n - 1;
		int q = n - 1;

		while (p >= 0 && q >= 0) {
			if (temp[p] == targ[q]) {
				p--;
				q--;
			} else {
				while (p >= 0 && temp[p] != targ[q]) {
					p--;
				}
			}
		}

		System.out.println(q + 1);

	}

	/**
	 * 元素平衡,任意两种元素可合成一种其他元素,输入四种元素,输出平衡后最大元素总和,若无法平衡则-1
	 * 输入:1 2 2 4
	 * 输出:8
	 */
	static void eleBalance() {
		int[] ele = { sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt() };
//		Arrays.sort(ele);
		int avg = (ele[0] + ele[1] + ele[2] + ele[3]) / 4;

		int sub = 0;

		int p = 0, q = avg;

		while (p <= q) {
			int i = (p + q) / 2;
			// System.out.println(i);

			sub = 0;
			for (int j = 0; j < ele.length; j++) {
				if (ele[j] > i) {
					sub += ele[j] - i;
				}
			}

			int count = 0;
			for (int j = 0; j < ele.length; j++) {
				if (ele[j] < i) {
					count += (i - ele[j]) * 2;
				}
			}

			if (sub == count) {
				System.out.println(i * 4);
				return;
			} else if (sub > count) {
				// System.out.println("P");
				p = i + 1;
			} else {
				q = i - 1;
			}
		}

		System.out.println(-1);
		return;

	}

	/**
	 * 正确+20,错误-10,不为负数
	 */
	static void dance() {
		char[] tar = sc.nextLine().toCharArray();
		char[] min = sc.nextLine().toCharArray();

		int con = 0;

		for (int i = 0; i < tar.length; i++) {
			if (tar[i] == min[i]) {
				con += 20;
			} else {
				con -= 10;
				con = con < 0 ? 0 : con;
			}
		}

		System.out.println(con);
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值