• <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 閱讀(405) 評論(0)  編輯 收藏 引用

            導航

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            常用鏈接

            留言簿

            隨筆檔案(4)

            文章檔案(3)

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久久AV老熟妇色| 中文字幕热久久久久久久| 色综合合久久天天综合绕视看| 国产午夜福利精品久久2021| 久久久国产精品网站| 久久综合九色综合久99| 精品国产乱码久久久久久呢| 国产亚洲精品美女久久久| 久久久久久久亚洲精品| 99久久精品毛片免费播放| 午夜精品久久久久久久无码| 蜜臀久久99精品久久久久久小说| 潮喷大喷水系列无码久久精品 | 久久精品男人影院| 少妇久久久久久被弄到高潮 | 国产一久久香蕉国产线看观看| 久久99国产精品二区不卡| 久久久噜噜噜久久中文字幕色伊伊 | 久久午夜免费视频| 国产免费久久精品99久久| 香蕉久久夜色精品升级完成| 久久久久亚洲精品男人的天堂 | 久久99精品国产99久久| 国产精品99久久久精品无码| 久久人人爽人人澡人人高潮AV | 99re久久精品国产首页2020| 久久中文字幕人妻熟av女| 久久精品国产第一区二区| 国产精品日韩深夜福利久久| 狠狠色婷婷综合天天久久丁香| 久久妇女高潮几次MBA| 超级碰碰碰碰97久久久久| 欧美精品一区二区久久| 久久精品国产亚洲精品| 国产精品热久久无码av| 精品久久久久久无码人妻热| 88久久精品无码一区二区毛片 | 久久99国产乱子伦精品免费| 亚洲精品乱码久久久久久蜜桃不卡| 狠狠色丁香久久婷婷综合_中| 日韩一区二区三区视频久久|