Party Lamps - USACO 2.2.4


partylamps - codetrick
To brighten up the gala dinner of the IOI'98 we have a set of N (10 <= N <= 100) colored lamps numbered from 1 to N.
The lamps are connected to four buttons:
  • Button 1: When this button is pressed, all the lamps change their state: those that are ON are turned OFF and those that are OFF are turned ON.
  • Button 2: Changes the state of all the odd numbered lamps.
  • Button 3: Changes the state of all the even numbered lamps.
  • Button 4: Changes the state of the lamps whose number is of the form 3xK+1 (with K>=0), i.e., 1,4,7,...
A counter C records the total number of button presses.
When the party starts, all the lamps are ON and the counter C is set to zero.
You are given the value of counter C (0 <= C <= 10000) and the final state of some of the lamps after some operations have been executed. Write a program to determine all the possible final configurations of the N lamps that are consistent with the given information, without repetitions.

PROGRAM NAME: lamps

INPUT FORMAT

Line 1: N
Line 2: Final value of C
Line 3: Some lamp numbers ON in the final configuration, separated by one space and terminated by the integer -1.
Line 4: Some lamp numbers OFF in the final configuration, separated by one space and terminated by the integer -1.
No lamp will be listed twice in the input.

SAMPLE INPUT (file lamps.in)

10  
1  
-1  
7 -1  
In this case, there are 10 lamps and only one button has been pressed. Lamp 7 is OFF in the final configuration.

OUTPUT FORMAT

Lines with all the possible final configurations (without repetitions) of all the lamps. Each line has N characters, where the first character represents the state of lamp 1 and the last character represents the state of lamp N. A 0 (zero) stands for a lamp that is OFF, and a 1 (one) stands for a lamp that is ON. The lines must be ordered from least to largest (as binary numbers).
If there are no possible configurations, output a single line with the single word `IMPOSSIBLE'

SAMPLE OUTPUT (file lamps.out)

0000000000  0101010101  0110110110  
In this case, there are three possible final configurations:
  • All lamps are OFF
  • Lamps 1, 4, 7, 10 are OFF and lamps 2, 3, 5, 6, 8, 9 are ON.
  • Lamps 1, 3, 5, 7, 9 are OFF and lamps 2, 4, 6, 8, 10 are ON.
TODO - http://qingtangpaomian.iteye.com/blog/1635377
总共就4个按钮...如果我1,2,3,4都按过一次了..再按一下1 or 2 or 3 or 4灯的情况不和只按了2,3,4 or 1,3,4 or 1,2,4 or  1,2,3一样吗?因为一个按钮按两次就相当于没按..那么实际上能出现的最多情况也就是C(1,4)+C(2,4)+C(3,4)+C(4,4)=17种~~枚举出这些情况..当且仅当当前所案件的次数与所需要的按键次数之差为偶数(不断地来回按)并且得到的情况是满足输入的要求的就找到了一个~~
这道题目还是暴力枚举,开关按两次以后等于没有按。如果同时按了偶数和奇数按钮等于按了一号按钮,按了一号和偶数等于按了奇数按钮,按了一号和奇数按钮等于按了偶数按钮。
那么无论怎么枚举按钮只可能出现以下8种情况:1.什么都没有按;2.只按了一号按钮;3.只按了奇数按钮;4.只按了偶数按钮;5.只按了3*k+1按钮;6.同时按了一号按钮和3*k+1按钮;7.同时按了奇数按钮和3*k+1按钮;8.同时按了偶数按钮和3*k+1按钮
由于只有以上的8种状态,现在难点就在于如何将这些状态与cnt(按了几次)对应起来。
 分析后,我们可以对cnt做如下分类:1. cnt ==0 ;2.cnt ==1;3.cnt==2 ;4.cnt==3;5.cnt>=4,并且cnt为偶数 ;6.cnt>4,并且cnt为奇数
cnt的前四种情况都比较简单,可以直接模拟出。现在讨论第5种和第6种情况,第5种情况等价于cnt==4的情况(因为最多有四个开关,所以cnt>4的时候一定可以找到两个开关作用两两相消除),第6种情况等价于cnt==3(原理同上)。
按照上面说明的情况,我们只需要对输入的cnt进行判断的,然后将该情况可能产生的亮灯状态与输入的开关灯状态比较,如果满足则输出。

https://github.com/TomConerly/Competition-Programming/blob/master/USACO/Chapter2/lamps.java
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new File("lamps.in"));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("lamps.out")));
int N = sc.nextInt();
int C = sc.nextInt();
ArrayList<Integer> setOn = new ArrayList<Integer>();
while(true)
{
int temp = sc.nextInt();
if(temp == -1) break;
setOn.add(temp-1);
}
ArrayList<Integer> setOff = new ArrayList<Integer>();
while(true)
{
int temp = sc.nextInt();
if(temp == -1) break;
setOff.add(temp-1);
}
boolean[] lights = new boolean[N];
Arrays.fill(lights,true);
r = new boolean[2][2][2][2][N];
r[0][0][0][0] = lights;
r[0][0][0][1] = move1(lights);
r[0][0][1][0] = move2(lights);
r[0][1][0][0] = move3(lights);
r[1][0][0][0] = move4(lights);
r[0][0][1][1] = move1(move2(lights));
r[0][1][0][1] = move1(move3(lights));
r[1][0][0][1] = move1(move4(lights));
r[0][1][1][0] = move2(move3(lights));
r[1][0][1][0] = move2(move4(lights));
r[1][1][0][0] = move3(move4(lights));
r[1][1][1][0] = move2(move3(move4(lights)));
r[1][1][0][1] = move1(move3(move4(lights)));
r[1][0][1][1] = move1(move1(move4(lights)));
r[0][1][1][1] = move1(move2(move3(lights)));
r[1][1][1][1] = move1(move2(move3(move4(lights))));
ArrayList<Answer> list = new ArrayList<Answer>();
for(int i = 0; i < 2;i++)
{
for(int j = 0; j < 2;j++)
{
for(int k = 0; k < 2;k++)
{
for(int m = 0; m < 2;m++)
{
if(C-i-j-k-m >= 0 && (C-i-j-k-m)%2 == 0)
{
boolean legal = true;
for(int on:setOn)
{
if(!r[i][j][k][m][on])legal = false;
}
for(int off:setOff)
{
if(r[i][j][k][m][off])legal = false;
}
if(legal) list.add(new Answer(i,j,k,m));
}
}
}
}
}
Collections.sort(list);
for(Answer a: list)
{
out.println(a.toString());
}
if(list.size() == 0)
out.println("IMPOSSIBLE");
out.close();
}
static boolean[][][][][] r;
private static class Answer implements Comparable<Answer>
{
int i,j,k,m;
public Answer(int a, int b, int c, int d)
{
i=a;
j=b;
k=c;
m=d;
}
public int compareTo(Answer a) {
for(int t = 0; t < r[0][0][0][0].length;t++)
{
if(r[i][j][k][m][t] && !r[a.i][a.j][a.k][a.m][t]) return 1;
if(!r[i][j][k][m][t] && r[a.i][a.j][a.k][a.m][t]) return -1;
}
return 0;
}
public String toString()
{
String out = "";
for(int t = 0; t < r[0][0][0][0].length;t++)
{
if(r[i][j][k][m][t]) out = out+"1";
else out = out+"0";
}
return out;
}
}
public static boolean[] move1(boolean[] in)
{
boolean[] ret = new boolean[in.length];
for(int i = 0; i < ret.length;i++)
{
ret[i] = !in[i];
}
return ret;
}
public static boolean[] move2(boolean[] in)
{
boolean[] ret = new boolean[in.length];
for(int i = 0; i < ret.length;i++)
{
if(i%2 == 1)
ret[i] = !in[i];
else
ret[i] = in[i];
}
return ret;
}
public static boolean[] move3(boolean[] in)
{
boolean[] ret = new boolean[in.length];
for(int i = 0; i < ret.length;i++)
{
if(i%2 == 0)
ret[i] = !in[i];
else
ret[i] = in[i];
}
return ret;
}
public static boolean[] move4(boolean[] in)
{
boolean[] ret = new boolean[in.length];
for(int i = 0; i < ret.length;i++)
{
if(i%3 == 0)
ret[i] = !in[i];
else
ret[i] = in[i];
}
return ret;
}

http://jackneus.com/programming-archives/party-lamps/
https://www.byvoid.com/blog/usaco-224-party-lamps

X.  Brute Force: 4^C
http://lujunda.cn/2012/08/04/usacosection-2-2%E6%90%9C%E7%B4%A2-party-lamps/
point op(int t,point temp)
//operation操作函数。
//参数t表示按钮编号。
//temp表示按钮作用的对象状态。
{
    if(t==1)
        for(int i=1;i<=n;i++)
            temp.arry[i]=temp.arry[i]-'0'?'0':'1';
    else if(t==2)
        for(int i=1;i<=n;i+=2)
            temp.arry[i]=temp.arry[i]-'0'?'0':'1';
    else if(t==3)
        for(int i=2;i<=n;i+=2)
            temp.arry[i]=temp.arry[i]-'0'?'0':'1';
    else
        for(int i=0;3*i+1<=n;i++)
            temp.arry[3*i+1]=temp.arry[3*i+1]-'0'?'0':'1';
    return temp;
}
bool check(point temp)
//检查temp是否与目标状态相符。
{
    for(int i=1;i<=n;i++)
    {
        if(on[i]&&temp.arry[i]=='0')
            return false;
        if(off[i]&&temp.arry[i]=='1')
            return false;
    }
    string result=temp.arry;
    if(mark[result])
    //检查temp是否与其他已确定的状态相重复。
        return false;
    mark[result]=true;
    return true;
}
void dfs(point temp,int sum)
//利用深搜枚举4^c种状态。
{
    if(sum==c)
    {
        if(check(temp))
            res[total++]=temp;
        return;
    }
    for(int i=1;i<5;i++)
        dfs(op(i,temp),sum+1);
}

http://lsharemy.com/wordpress/index.php/csit/usaco-prob-party-lamps/
Read full article from partylamps - codetrick

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts