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;
    }
};



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