求助,90卡#3
  • 板块P5027 Barracuda
  • 楼主Venarys
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/22 16:53
  • 上次更新2023/10/27 01:56:35
查看原帖
求助,90卡#3
638547
Venarys楼主2022/11/22 16:53

不知道错哪了呜呜呜

#include <cstdio>
#include <algorithm>
#include <set>
#include <cmath>
#include <cstring>

std::set<int> s;
void read();
void gauss();
const int N = 110;
int c[N][N],n,m,cnt,rans;
double a[N][N],x[N];
bool nosol;
inline bool noint(double x){
	if (floor(x) == x)
		return 0;
	return 1;
}

int main(){
	read();

	for (int i1 = 1;i1 <= n+1 && cnt <= 1;++i1){
		int fault = i1;
		int hh = 0;
		for (int i2 = 1;i2 <= n+1;++i2){
			if (i2 == fault)
				continue;
			hh++;
			for (int k = 1;k <= n+1;++k)
				a[hh][k] = c[i2][k];
		}

		gauss();
		if (nosol == true)
			continue;
		else
			cnt++;
	}
	
	if (cnt != 1)
		puts("illegal");
	else
		printf("%d\n",rans);
	return 0;
}

void read(){
	scanf("%d",&n);
	for (int i = 1;i <= n+1;++i){
		s.clear();
		scanf("%d",&m);
		for (int j = 1;j <= m;++j){
			int tmp;
			scanf("%d",&tmp);
			s.insert(tmp);
		}
		scanf("%d",&c[i][n+1]);

		for (int k = 1;k <= n;++k)
			if (s.find(k) != s.end())
				c[i][k] = 1;
	}
}
void gauss(){
	nosol = false;
	int ans = 0;
	for (int j = 1;j <= n;++j){
		int maxi = j;
		for (int i = j;i <= n;++i)
			if (a[maxi][j] < a[i][j])
				maxi = i;
		if (fabs(a[maxi][j]) <= 1e-5){
			nosol = true;
			return;
		}
		for (int k = 1;k <= n+1;++k)
			std::swap(a[j][k],a[maxi][k]);

		for (int i = 1;i <= n;++i){
			if (i == j)
				continue;
			double fac = a[i][j]/a[j][j];
			for (int k = 1;k <= n+1;++k)
				a[i][k] -= fac*a[j][k];
		}
	}

	for (int i = 1;i <= n;++i){
		x[i] = a[i][n+1]/a[i][i];
		if (x[i] <= 0 || noint(x[i]) ){
			nosol = true;
			return;
		}
		if (x[i] > x[ans])
			ans = i;
	}
	for (int i = 1;i <= n;++i){
		if (ans == i)
			continue;
		if (x[ans] == x[i]){
			nosol = true;
			return ;
		}
	}

	rans = ans;
}

2022/11/22 16:53
加载中...