做题时候遇到的迷之问题

下列列举了一些奇怪的情况,经常是做了四五个小时觉得自己完全没有错误但是仍然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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值