下列列举了一些奇怪的情况,经常是做了四五个小时觉得自己完全没有错误但是仍然AC不了的case。
可能是我自己有很多东西没有熟练吧。
每一阶段训练结束之后都要回过头来看看这些题看看能不能解决。
1. POJ 2240。迷之WA
这道题是我练Bellman-Ford的时候的一道题,开始做这道题的时候也就是用Bellman-Ford算负环,然后WA,网上一搜看到有人是用了n次Bellman-Ford但是也有人只用了一次Bellman-Ford,于是我就改呀改,两种思路都试了,代码相似度和AC的代码基本一样了,结果还是WA,一晚上,卒。
然后我就开始学Floyd,因为别人说这道题Floyd也可以解,于是学会Floyd之后又来做这道题,结果还是WA,卒。
跨年的礼物啊哈哈哈。
(仍未解决)
2. POJ 1789。迷之TLE
这道题是我练最小生成树的第一道题,好的吧从第一次交就开始一直TLE。
按理说prim算法是O(V^2),但是这道题是稠密图,如果加优化的话时间到了O(ElogV)不见得可以快,所以我也没优化。
可问题在于网上很多人裸prim都能AC,可是我就是过不了。一晚上,卒。
新年第一天的礼物卧槽。
(仍未解决)
#include <iostream> #include <list> #include <map> #include <string.h> #include <string> #include <algorithm> using namespace std; int n; const int INF = 100000000; int w[2003][2003]; int min_tree[2003]; bool vis[2003]; string ss[2003]; int diff(string s1, string s2) { int res = 0; for (int i = 0; i < 7; i++) { if (s1[i] != s2[i]) res++; } return res; } int prim() { for (int i = 0; i < n; i++) { min_tree[i] = w[0][i]; vis[i] = false; } min_tree[0] = 0; int res = 0; while (true) { int v = -1; for (int u = 0; u < n; u++) { if (!vis[u] && (v == -1 || (v != -1 && min_tree[u] < min_tree[v]))) v = u; } if (v == -1) break; vis[v] = true; res += min_tree[v]; for (int u = 0; u < n; u++) { min_tree[u] = min_tree[u] > w[v][u] ? w[v][u] : min_tree[u]; } for (int u = 0; u < n; u++) { cout << min_tree[u] << " "; } cout << endl; } return res; } int main() { while (cin >> n && n) { for (int i = 0; i < n; i++) { cin >> ss[i]; } for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { if (i == j) { w[i][j] = w[j][i] = INF; } if (w[i][j] != 0) continue; w[i][j] = diff(ss[i], ss[j]); w[j][i] = w[i][j]; } } int res = prim(); cout << "The highest possible quality is 1/" << res << "." << endl; } return 0; }
3.