Fork me on GitHub

3617.Best Cow Line --最小字典序(相同比较下一个)

FJs是带了一群奶牛去参加“农场年”的竞赛,在这个比赛项目下 每一个农场主 对他们的奶牛排列成一行 【herd】然后把他们赶到比赛现
场,这个比赛的组织方提出一种新的注册方案【registration注册 scheme方案】只需按照每头母牛出现的顺序登记其首字母即可。
【initial最初的 letter信/校运会领队 phase阶段】根据奶牛名字的首字母串来判断每一组的词典编纂顺序。【increasing lexicographic order 增加词典编纂顺序】
FJ非常忙碌而且不得不待会他的农场 他想尽可能简单被判决,他在注册前以及保持原来的队形上决定重新排列这群奶牛,FJ标记一个
新的地方 用于竞赛中奶牛的新的站线,然后,他继续将牛从旧的列编组到新的列,通过重复地将原始列(剩余的)中的第一个或最后一
个列发送到新列的末尾。当他完成后,FJ带着他的牛按新的顺序登记。【proceeds收入, 接着做 marshal陆军元帅 安排 first or last迟早,早晚
remainder其他人员; 剩余物  廉价出售的图书 original line起点线 end of结尾; 为某事物的结尾; 末尾】
正确的翻译:
FJ将带他的N(1≤N≤2000)头牛参加年度“年度农民”比赛。在这场比赛中,每一个农场主都排成一行,把奶牛赶过裁判席。今年,比赛组
织者采用了一个新的注册方案:只需按照每头母牛出现的顺序来注册它们的首字母(即,如果FJ按照顺序接收了贝西、西尔维亚和多拉,那
么它只需注册BSD)。在注册阶段结束后,根据奶牛名字的首字母串,判断每组的词典顺序增加。FJ今年很忙,不得不赶回他的农场,所以
他想尽早得到评判。他决定重新安排已经排好队的奶牛,然后再登记。FJ标志着一条新的竞争奶牛的位置。然后,他继续将牛从旧的列编组
到新的列,通过重复地将原始列(剩余的)中的第一个或最后一个列发送到新列的末尾。当他完成后,FJ带着他的牛按新的顺序登记。考虑
到奶牛的初始顺序,确定他能用这种方法做的最小词典字首串。
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int sum = sc.nextInt();
			char arr[] = new char[sum];
			for (int i = 0; i < sum; i++) {
				arr[i] = sc.next().charAt(0);
			}
			int a = 0;
			int b = sum - 1;
			String ans = "";
			int count = 0;
			while (a <= b) {
				boolean left = false;
				for (int i = 0; a + i < b; i++) // 利用布尔变量记录每一次比较结果
				{
					if (arr[a + i] < arr[b - i]) {
						left = true;
						count++;
						break;
					} else if (arr[a + i] > arr[b - i]) {
						left = false;
						count++;
						break;
					}
				}
				if (left) // 根据布尔值进行输出! //统一在括号外处理避免bug 之前一种写法是 相等是随便取一个 没有注意到break后 又执行外面的代码造成重复
				{
					System.out.print(arr[a++]);
				} else {
					System.out.print(arr[b--]);
				}
				if (count % 80 == 0) // 记得分行
					System.out.println();
			}
			System.out.println();
		}
	}
}
posted @ 2019-07-07 22:07  cznczai  阅读(241)  评论(0编辑  收藏  举报