求助(不开O2 AC,开 O2 90 pts WA on #1)
查看原帖
求助(不开O2 AC,开 O2 90 pts WA on #1)
728614
dingxiongyue楼主2025/1/23 21:10

#1数据:

in:

2
1 1 2
3 3 6

out:

No Solution

Code:

#include <iostream>
#include <cmath>
#define int long long
using namespace std;
typedef double db;
const int N = 1010;
int n;
bool flag;
db a[N][N], b[N], x[N];
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}

inline void write(int x) {
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

void Guass(){
	for (int i = 1; i <= n; i++) {
		int r = i;
		for (int j = i + 1;j <= n; j++) {
			if (abs(a[j][i]) > abs(a[r][i])) {
				r = j;
			}
		}
		if (r != i) {
			for (int j = i; j <= n; j++) {
				swap(a[r][j], a[i][j]);
			}
			swap(b[r], b[i]);
		}
		for (int j = i + 1; j <= n; j++) {
			if (a[i][i] == 0) {
				puts("No Solution");
				flag = true;
				break;
			} 
			db k = a[j][i] / a[i][i];
			for (int l = i; l <= n; l++)
				a[j][l] -= k * a[i][l];
			b[j] -= k * b[i];
		}
		if(flag) break;
	}
	if(flag) return;
	for (int i = 1; i <= n; i++) {
		int cnt = 0;
		for(int j = 1; j <= n; j++)
			if (a[i][j] == 0) cnt++;
		if(cnt == n && a[i][n] != 0) {
			puts("No Solution");
			flag = true;
		}
		if(cnt == n + 1) {
			puts("No Solution");
			flag = true;
		}
	}
	for (int i = n; i >= 1; i--) {
		if (a[i][i] == 0) {
			puts("No Solution");
			flag = true;
			break;
		}
		x[i] = b[i] / a[i][i];
		for (int j = i - 1; j >= 1; j--) {
			b[j] -= a[j][i] * x[i];
		}
	}
}

signed main() {
	n =read();
	for (int i = 1; i <= n; i++) { 
		for (int j = 1; j <= n; j++) {
			a[i][j] = read();
		}
		b[i] = read();
	}
	Guass();
	if(flag) return 0;
	for (int i = 1; i <= n; i++)
		printf("%.2lf\n", x[i]);
	return 0;
}

评测记录:

开O2

不开O2

2025/1/23 21:10
加载中...