做題時候遇到的迷之問題

下列列舉了一些奇怪的情況,經常是做了四五個小時覺得自己完全沒有錯誤但是仍然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.

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