TC SRM 562 div2 B 题

题意:

给你一个矩形的画布,此画布由‘B’和‘.’组成,画T次每次画的时候他的左上角的起始点是确定的几位(1,1),(2,2),(3,3)......(T,T); 在画的过程中可能会出现相互覆盖求画完T次后一共有多少个‘B’

{

"..B",

"B..",

"BB."

}
3
Returns: 10

TC SRM 562 div2 B 题

思路:

假设矩形的长度为n次,开始我一直在思考覆盖完n次后减去多少,在第n次以后每一个减去的都一样了。不过这样会出现重复的减去,不对。我们只需要考虑在覆盖n个后第一个的总共剩下多少个没有被覆盖的。以后都是一样的了。最后我们只需要计算一下最后n-1个的数就可以了。最后计算的复杂度为O(50^3).

class PastingPaintingDivTwo

{

        public:

        long long countColors(vector <string> clipboard, int T)

        {

            char tp[55][55];

            int i,j,ki,kj,k;

            int sz = clipboard.size();



            if (sz == 1)

            {

                LL ans = 0;

                for (i = 0; i < clipboard[0].size(); ++i)

                if (clipboard[0][i] == 'B') ans += 1;

               // printf("11111111111111\n");

                ans = ans*T;

                return ans;

            }

            else

            {

                LL ans = 0;

                for (i = 0; i < sz; ++i)

                {

                    for (j = 0; j < clipboard[i].size(); ++j)

                    {

                        tp[i][j] = clipboard[i][j];

                    }

                }

                LL ct;

                for (k = 1; k < sz; ++k)

                {

                    for (i = k, j = 0; i < sz; ++i,++j)

                    {

                        for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj)

                        {

                            if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B')

                            {

                                tp[i][ki] = '.';

                            }

                        }

                    }

                }

                ct = 0;

                for (i = 0; i < sz; ++i)

                {

                    for (j = 0; j < clipboard[i].size(); ++j)

                    {

                        if (tp[i][j] == 'B') ct++;

                    }

                }

                if (T - (sz - 1) > 0)

                ans  = (LL)(T - (sz - 1))*ct;



                // cout<<ans<<endl;

                int p;  CL(tp,0);

                int mk = min(sz - 1,T);

                for (p = 1; p <= mk; ++p)

                {

                    for (i = 0; i < sz; ++i)

                    {

                        for (j = 0; j < clipboard[i].size(); ++j)

                        {

                            tp[i][j] = clipboard[i][j];

                            //tt[i][j] = clipboard[i][j];

                        }

                    }

                    for (k = 1; k < sz - p; ++k)

                    {

                        for (i = k, j = 0; i < sz; ++i,++j)

                        {

                            for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj)

                            {

                                if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B')

                                {

                                    tp[i][ki] = '.';

                                }

                            }

                        }

                    }

                    ct = 0;

                    for (i = 0; i < sz; ++i)

                    {

                        for (j = 0; j < clipboard[i].size(); ++j)

                        {

                            if (tp[i][j] == 'B') ct++;

                        }

                    }

                    ans += ct;

                }

                //printf("222222222222\n");

                return ans;

            }

        }

};

        

  

你可能感兴趣的:(div)