srm 530

srm 529感觉题并不是很有趣,所以不打算写题解辣>_<

250


Solution

唔,这是个傻逼题,随便暴力下就好= =

Code

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii; 
class GogoXCake { 
public: 
   string solve( vector <string> cake, vector <string> cutter ) { 
     int m = cutter.size(), n = cutter[0].size(); 
     for (int i = 0; i + m <= cake.size(); ++i) {       
        for (int j = 0; j + n <= cake[0].size(); ++j) { 
            bool canUse = true; 
            for (int x = 0; x < m; ++x) 
                for (int y = 0; y < n; ++y) 
                     if (cutter[x][y] == '.' && cake[i + x][j + y] == 'X') 
                        canUse = false; 
            if (canUse) { 
                 for (int x = 0; x < m; ++x) 
                    for (int y = 0; y < n; ++y) 
                        if (cutter[x][y] == '.') 
                            cake[i + x][j + y] = 'X'; 
            } 
        }    
     } 
     for (int i = 0; i < cake.size(); ++i) 
        for (int j = 0; j < cake[0].size(); ++j) 
            if (cake[i][j] == '.') 
                return "NO"; 
     return "YES"; 
   } 
}; 

500



Description:

给定一个邻接矩阵表示的图,求0n1 最多有多少条路径,满足这些路径按一定顺序排列后每条路径至少出现一条之前没有出现过的边。

Solution

感觉这是道非常好的题,可惜自己太弱,听别人讲了才会>_<
首先求出传递闭包,然后我们保留那些能从0 到达并且能到n1 的点,标记除0,n1 外所有点visited为false。
然后我们找一个没走过的点v ,从一个走过的点u 走到v ,然后把v 标记为走过。当所有点都标记为走过的时候,随意选一个没走过的边,都可以用已经走过的边形成一条路径。
所以最开始用来标记这n2 个点一共用了n1 条边,形成一条路径。其余m(n1)=mn+1 条边每条边都形成一个新的路径,所以一共有1+mn+1=mn+2 条路径。
真是一道很好的题

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
bool g[N][N];
class GogoXMarisaKirisima {
    public:
    int solve(vector <string> choices) {
        int n = choices.size();
        for (int i = 0; i < n; ++i) {
            g[i][i] = 1;
            for (int j = 0; j < n; ++j)
                if (choices[i][j] == 'Y')   g[i][j] = 1;
        }
        for (int k = 0; k < n; ++k)
            for (int i = 0; i < n; ++i)
                for (int j = 0; j < n; ++j)
                    g[i][j] |= g[i][k] & g[k][j];
        if (!g[0][n - 1])   return 0;
        int ans = 0;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                if (choices[i][j] == 'Y' && g[0][i] && g[j][n - 1]) ++ans;
        for (int i = 1; i < n - 1; ++i)
            if (g[0][i] && g[i][n - 1]) --ans;
        return ans;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章