• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Google code jam 2008 R1A - Milkshakes

            Problem

            You own a milkshake shop. There are N different flavors that you can prepare, and each flavor can be prepared "malted" or "unmalted". So, you can make 2N different types of milkshakes.

            Each of your customers has a set of milkshake types that they like, and they will be satisfied if you have at least one of those types prepared. At most one of the types a customer likes will be a "malted" flavor.

            You want to make N batches of milkshakes, so that:

            • There is exactly one batch for each flavor of milkshake, and it is either malted or unmalted.
            • For each customer, you make at least one milkshake type that they like.
            • The minimum possible number of batches are malted.

            Find whether it is possible to satisfy all your customers given these constraints, and if it is, what milkshake types you should make.

            If it is possible to satisfy all your customers, there will be only one answer which minimizes the number of malted batches.

            Input

            • One line containing an integer C, the number of test cases in the input file.

            For each test case, there will be:

            • One line containing the integer N, the number of milkshake flavors.
            • One line containing the integer M, the number of customers.
            • M lines, one for each customer, each containing:
              • An integer T >= 1, the number of milkshake types the customer likes, followed by
              • T pairs of integers "X Y", one for each type the customer likes, where X is the milkshake flavor between 1 and N inclusive, and Y is either 0 to indicate unmalted, or 1 to indicated malted. Note that:
                • No pair will occur more than once for a single customer.
                • Each customer will have at least one flavor that they like (T >= 1).
                • Each customer will like at most one malted flavor. (At most one pair for each customer has Y = 1).
              All of these numbers are separated by single spaces.

            Output

            • C lines, one for each test case in the order they occur in the input file, each containing the string "Case #X: " where X is the number of the test case, starting from 1, followed by:
              • The string "IMPOSSIBLE", if the customers' preferences cannot be satisfied; OR
              • N space-separated integers, one for each flavor from 1 to N, which are 0 if the corresponding flavor should be prepared unmalted, and 1 if it should be malted.

            Limits

            Small dataset

            C = 100
            1 <= N <= 10
            1 <= M <= 100

            Large dataset

            C = 5
            1 <= N <= 2000
            1 <= M <= 2000

            The sum of all the T values for the customers in a test case will not exceed 3000.

            Sample


            Input
             

            Output
             
            2
            5
            3
            1 1 1
            2 1 0 2 0
            1 5 0
            1
            2
            1 1 0
            1 1 1
            Case #1: 1 0 0 0 0
            Case #2: IMPOSSIBLE

            In the first case, you must make flavor #1 malted, to satisfy the first customer. Every other flavor can be unmalted. The second customer is satisfied by getting flavor #2 unmalted, and the third customer is satisfied by getting flavor #5 unmalted.

            In the second case, there is only one flavor. One of your customers wants it malted and one wants it unmalted. You cannot satisfy them both.

            Analysis
            On the surface, this problem appears to require solving the classic problem "Satisfiability," the canonical example of an NP-complete problem. The customers represent clauses, the milkshake flavors represent variables, and malted and unmalted flavors represent whether the variable is negated.

            We are not evil enough to have chosen a problem that hard! The restriction that makes this problem easier is that the customers can only like at most one malted flavor (or equivalently, the clauses can only have at most one negated variable.)

            Using the following steps, we can quickly find whether a solution exists, and if so, what the solution is.

            1. Start with every flavor unmalted and consider the customers one by one.
            2. If there is an unsatisfied customer who only likes unmalted flavors, and all those flavors have been made malted, then no solution is possible.
            3. If there is an unsatisfied customer who has one favorite malted flavor, then we must make that flavor malted. We do this, then go back to step 2.
            4. If there are no unsatisfied customers, then we already have a valid solution and can leave the remaining flavors unmalted.

            Notice that whenever we made a flavor malted, we were forced to do so. Therefore, the solution we got must have the minimum possible number of malted flavors.

            With clever data structures, the above algorithm can be implemented to run in linear time.

            More information:

            The Satisfiability problem - Horn clauses


            Source Code
            #include <iostream>

            using namespace std;

            #define Rep(i,n) for (int i(0),_n(n); i<_n; ++i)

            struct Flavor{
                
            int X;
                
            char Y;
            }
            ;

            struct Customer{
                
            int T;
                Flavor
            * F;
                Customer() 
            {
                    F 
            = NULL;
                }

                
            ~Customer() {
                    
            if(NULL!=F) {
                        delete[] F;
                        F 
            = NULL;
                    }

                }

                
            void Init(int t) {
                    T 
            = t;
                    F 
            = new Flavor[T];
                }

                
            void SetFlavor(int i, int X, int Y) {
                    F[i].X 
            = X;
                    F[i].Y 
            = Y;
                }

                
            int GetFlavorX(int i) {
                    
            return F[i].X;
                }

                
            int GetFlavorY(int i) {
                    
            return F[i].Y;
                }

                
            bool IsSatisfied() {
                    
            return T==0;
                }

                
            void Satisfy() {
                    T
            =0;
                    
            if(NULL!=F) {
                        delete[] F;
                        F 
            = NULL;
                    }

                }

                
            bool IsSatisfing(int i, int *f) {
                    
            return f[F[i].X]==F[i].Y;
                }

                
            void SetMalted(int i, int *f) {
                    f[F[i].X] 
            = 1;
                }

            }
            ;

            int main()
            {
                
            int C;
                FILE 
            *fp = fopen("A.out""w");
                scanf(
            "%d"&C);
                Rep(c, C) 
            {
                    
            int N;
                    scanf(
            "%d"&N);
                    
            int* f = new int[N+1];
                    Rep(i ,N
            +1{
                        f[i]
            =0;
                    }

                    
            int M;
                    scanf(
            "%d"&M);
                    Customer
            * customer = new Customer[M];
                    Rep(m, M) 
            {
                        
            int T;
                        scanf(
            "%d"&T);
                        customer[m].Init(T);
                        Rep(t, T) 
            {
                            
            int X, Y;
                            scanf(
            "%d%d"&X,&Y);
                            customer[m].SetFlavor(t,X,Y);
                        }

                    }

                    
            bool findSolution = true;
                    
            int m = 0;
                    
            while(m<M) {
                        
            if(customer[m].IsSatisfied()) {
                            m
            ++;
                            
            continue;
                        }

                        
            bool malted = false;
                        
            int idx;
                        
            bool satisfied = false;
                        Rep(t, customer[m].T) 
            {
                            
            if(customer[m].GetFlavorY(t)==1{
                                malted 
            = true;
                                idx 
            = t;
                            }

                            
            if(customer[m].IsSatisfing(t,f)) {
                                satisfied 
            = true;
                            }

                        }

                        
            if(!satisfied) {
                            
            if(malted) {
                                customer[m].SetMalted(idx,f);
                                customer[m].Satisfy();
                                m
            =0;
                            }
             else {
                                findSolution 
            = false;
                                
            break;
                            }

                        }
             else {
                            m
            ++;
                        }

                    }

                    fprintf(fp,
            "Case #%d: ", c+1);
                    
            if(findSolution) {
                        Rep(i ,N) 
            {
                            fprintf(fp,
            "%d ", f[i+1]);
                        }

                        fprintf(fp,
            "\n");
                    }
             else {
                        fprintf(fp,
            "IMPOSSIBLE\n");
                    }

                    delete[] customer;
                    delete[] f;

                }

                fclose(fp);
            }

            posted on 2009-08-12 21:17 Chauncey 閱讀(415) 評(píng)論(0)  編輯 收藏 引用

            導(dǎo)航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆檔案(4)

            文章檔案(3)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            中文字幕无码久久人妻| 亚洲精品乱码久久久久久蜜桃图片 | 国产成人综合久久综合| 国产午夜电影久久| 久久亚洲精品无码aⅴ大香| 久久综合给合久久狠狠狠97色 | 国产精品久久成人影院| 亚洲午夜无码AV毛片久久| 浪潮AV色综合久久天堂| 日韩欧美亚洲国产精品字幕久久久 | 中文字幕久久精品| 国产叼嘿久久精品久久| 蜜臀av性久久久久蜜臀aⅴ| 久久综合给合综合久久| 国产午夜久久影院| 综合网日日天干夜夜久久| 久久婷婷五月综合97色直播| 久久综合九色综合97_久久久| 伊人久久大香线蕉精品不卡| 久久se精品一区二区影院 | 久久久久亚洲精品日久生情| 青青国产成人久久91网| 国内精品久久久久影院日本| 久久无码专区国产精品发布 | 欧美亚洲色综久久精品国产| 午夜精品久久影院蜜桃| 麻豆国内精品久久久久久| 亚洲综合精品香蕉久久网97| 久久福利青草精品资源站免费| 久久久免费精品re6| 久久精品蜜芽亚洲国产AV| 久久丫精品国产亚洲av不卡| 性做久久久久久久| 人妻久久久一区二区三区| 色综合久久久久综合体桃花网| 97久久婷婷五月综合色d啪蜜芽| 久久久久精品国产亚洲AV无码| 久久久精品国产免大香伊| 色综合久久无码中文字幕| 精品综合久久久久久97超人| 婷婷综合久久中文字幕|