USACO Starry Night 解題報告

2021-06-25 23:59:31 字數 3052 閱讀 9403

user: chen chen [thestor1]

task: starry

lang: c++

compiling...

compile: ok

executing...

test 1: test ok [0.008 secs, 3508 kb]

test 2: test ok [0.008 secs, 3508 kb]

test 3: test ok [0.011 secs, 3508 kb]

test 4: test ok [0.008 secs, 3508 kb]

test 5: test ok [0.016 secs, 3508 kb]

all tests ok.

your program ('starry') produced all correct answers! this is your

submission #3 for this problem.congratulations!

這道題我是用的是最直接的方法。用dfs得到每個cluster,然後之前所有的cluster都逐一比較。比較的時候也是8種形狀逐一比較。當然,先比較star的個數是否一樣,輪廓(長方形)是否一樣。每個cluster還用乙個set儲存了裡面所有的點。如果usaco支援unordered_set的話,說不定會更快些。標準答案比較的時候看著像是位操作啥的,應該比我的直觀解法快特別多,也沒看懂。

/* id: thestor1

lang: c++

task: starry

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include // #include using namespace std;

const int maxw = 100;

class cluster

};bool isin(int r, int c, int h, int w)

inline int index(int r, int c)

void dfs(int r, int c, int h, int w, vector> &skymap, cluster &cluster)

if (cluster.lr < 0 || c < cluster.lr)

if (r > cluster.ul)

if (c > cluster.ur)

skymap[r][c] = cluster.label;

cluster.size++;

// cluster.ones.push_back(make_pair(r, c));

cluster.ones.insert(index(r, c));

int dx = , dy = ;

for (int d = 0; d < 8; ++d) }

}bool issame(const cluster &c1, cluster &c2, vector> &skymap)

if (c1.h == c2.h && c1.w == c2.w)

}if (!flag)

}if (flag)

// up->down, right->left

flag = true;

for (int i1 = c1.ll, i2 = c2.ll; i1 <= c1.ul && i2 <= c2.ul; ++i1, ++i2)

}if (!flag)

}if (flag)

// down->up, left->right

flag = true;

for (int i1 = c1.ll, i2 = c2.ul; i1 <= c1.ul && i2 >= c2.ll; ++i1, --i2)

}if (!flag)

}if (flag)

// down->up, right->left

flag = true;

for (int i1 = c1.ll, i2 = c2.ul; i1 <= c1.ul && i2 >= c2.ll; ++i1, --i2)

}if (!flag)

}if (flag)

}if (c1.h == c2.w && c1.w == c2.h)

}if (!flag)

}if (flag)

// right->left, down->up

flag = true;

for (int i1 = c1.ll, j2 = c2.ur; i1 <= c1.ul && j2 >= c2.lr; ++i1, --j2)

}if (!flag)

}if (flag)

// left->right, up->down

flag = true;

for (int i1 = c1.ll, j2 = c2.lr; i1 <= c1.ul && j2 <= c2.ur; ++i1, ++j2)

}if (!flag)

}if (flag)

// right->left, up->down

flag = true;

for (int i1 = c1.ll, j2 = c2.ur; i1 <= c1.ul && j2 >= c2.lr; ++i1, --j2)

}if (!flag)

}if (flag)

}return false;

}void repaint(vector> &skymap, char label, cluster &cluster)

} }}int main()

} }char label = 'a';

for (int r = 0; r < h; ++r)

}if (unique)

}} }

for (int r = 0; r < h; ++r)

{ for (int c = 0; c < w; ++c)

{ fout<

USACO Hamming Codes 解題報告

資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...

USACO Closed Fences 解題報告

幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...

Wiggle Subsequence解題報告

這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...