标签:style blog http color ar java for sp div
题目来源:Flip and Shift
题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起。你可以有以下两种操作:
1、顺时针旋转所有的盘子
2、顺时针旋转3个盘子
解题思路:第一种操作表明你可以对任意一个盘子执行第二种操作,所以重点在于第二种操作。仔细分析一下会发现,第二种操作其实就是将某一个盘子当前的index加2,所以我们可以先统计一下黑色盘子的个数count,然后用一个数组将所有的盘子存起来,使数组中0-count所存放的是黑色盘子(通过下标加2的操作),如果到最后都是黑色盘子,则输出YES,反之NO。
具体算法(java版,可以直接AC)
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner scanner = new Scanner(System.in); 7 int casNum = scanner.nextInt(); 8 for (int i = 0; i < casNum; i++) { 9 int len = scanner.nextInt(); 10 int[] array = new int[len]; 11 int count = 0; 12 for (int j = 0; j < len; j++) { 13 array[j] = scanner.nextInt(); 14 if (array[j] == 1) { 15 count++; 16 } 17 } 18 19 for (int j = count ; j < len; j++) { 20 if (array[j] == 1) { 21 int index = j; 22 while (index >= count) { 23 index = (index + 2) % len; 24 } 25 while (array[index] == 1 && index < count) { 26 index = (index + 2) % len; 27 } 28 if (index < count) { 29 int temp = array[index]; 30 array[index] = array[j]; 31 array[j] = temp; 32 } 33 } 34 } 35 boolean flag = true; 36 for (int j = 0; j < count; j++) { 37 if (array[j] == 0) { 38 flag = false; 39 break; 40 } 41 } 42 if (flag) { 43 System.out.println("YES"); 44 } else { 45 System.out.println("NO"); 46 } 47 } 48 } 49 50 }
POJ 1063 Flip and Shift 最详细的解题报告
标签:style blog http color ar java for sp div
原文地址:http://www.cnblogs.com/pinxiong/p/4034290.html