用交叉相乘就 WA 50pts
查看原帖
用交叉相乘就 WA 50pts
765958
lottle1212楼主2023/4/24 20:46

本人用交叉相乘判断,结果就 WA 了,求助大佬。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7f7f7f7f;
const ll mxn = 500, mxm = 5e3;
const ll N = mxn + 10, M = mxm + 10;
ll n, m, bgn, nd, ans_min, ans_max, f[N];
struct node { ll x, y, v; } a[M];
ll get_fa(ll x) { if(x == f[x]) return x; return f[x] = get_fa(f[x]); }
void merge(ll x, ll y) { ll fx = get_fa(x), fy = get_fa(y); if(fx ^ fy) f[fx] = fy; }
ll gcd(ll x, ll y) { ll z = x % y; while(z) x = y, y = z, z = x % y; return y; }
bool cmp(node x, node y) { return x.v < y.v; }
void init() { for(ll i = 1; i <= n; ++ i) f[i] = i; }
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for(ll i = 1; i <= m; ++ i) cin >> a[i].x >> a[i].y >> a[i].v;
	cin >> bgn >> nd; ans_min = 0, ans_max = INF;
	sort(a + 1, a + m + 1, cmp);
	for(ll i = 1; i <= m; ++ i) {
		init();
		for(ll j = i; j <= m; ++ j) {
        
        
        
			merge(a[j].x, a[j].y);
			if(get_fa(bgn) == get_fa(nd)) {
				if(a[j].v * ans_min < a[j].v * ans_max) ans_min = a[i].v, ans_max = a[j].v;
				break;
                
                
                
			}
		}
	}
	if(ans_min == 0 && ans_max == INF) cout << "IMPOSSIBLE\n";
	else if(ans_max % ans_min == 0) cout << ans_max / ans_min << '\n';
	else cout << ans_max / gcd(ans_max, ans_min) << '/' << ans_min / gcd(ans_max, ans_min) << '\n';
	return 0;
}

不明白的是判断时换成小数就 AC 了。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7f7f7f7f;
const ll mxn = 500, mxm = 5e3;
const ll N = mxn + 10, M = mxm + 10;
ll n, m, bgn, nd, ans_min, ans_max, f[N]; double ans;
struct node { ll x, y, v; } a[M];
ll get_fa(ll x) { if(x == f[x]) return x; return f[x] = get_fa(f[x]); }
void merge(ll x, ll y) { ll fx = get_fa(x), fy = get_fa(y); if(fx ^ fy) f[fx] = fy; }
ll gcd(ll x, ll y) { ll z = x % y; while(z) x = y, y = z, z = x % y; return y; }
bool cmp(node x, node y) { return x.v < y.v; }
void init() { for(ll i = 1; i <= n; ++ i) f[i] = i; }
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for(ll i = 1; i <= m; ++ i) cin >> a[i].x >> a[i].y >> a[i].v;
	cin >> bgn >> nd; ans_min = 0, ans_max = INF, ans = 0;
	sort(a + 1, a + m + 1, cmp);
	for(ll i = 1; i <= m; ++ i) {
		init();
		for(ll j = i; j <= m; ++ j) {
			merge(a[j].x, a[j].y);
			if(get_fa(bgn) == get_fa(nd)) {
            
            
				double tmp = 1.0 * a[i].v / a[j].v;
				if(tmp > ans) ans_min = a[i].v, ans_max = a[j].v, ans = tmp;
				break;
                
          	//改动处
			}
		}
	}
	if(ans_min == 0 && ans_max == INF) cout << "IMPOSSIBLE\n";
	else if(ans_max % ans_min == 0) cout << ans_max / ans_min << '\n';
	else cout << ans_max / gcd(ans_max, ans_min) << '/' << ans_min / gcd(ans_max, ans_min) << '\n';
	return 0;
}

大佬们救我!!!

2023/4/24 20:46
加载中...