为啥我在站外oj过不去啊QWQ
查看原帖
为啥我在站外oj过不去啊QWQ
1220111
xiaoyang222楼主2024/11/22 22:04

rt,求调。

#include <iostream>
using namespace std;
const int N=500+5;
double a[N][N],w[N][N],ans[N];
bool freeopen[N];
int n,m,iac[N];
//n+1项为b
//f(S)+f(T)=f(S U T),S 交 T = 空集,使得可以用前缀和,列出方程
void modify(int t1,int t2,double q){
	a[t1][t2]+=q;
}
void solve(){//消元
	double qwq;
	for (int i=1,j=1;i<=n && j<=m;++i){
		for (int k=i+1;k<=n;++k)
			if (a[k][j]){
				for (int p=1;p<=m+1;++p) swap(a[i][p],a[k][p]);
				break;
			}
		if (a[i][j]){
			for (int k=1;k<=n;++k){
				if (i==k) continue;
				qwq=a[k][j]/a[i][j];
				for (int q=1;q<=m+1;++q){
					a[k][q]=a[k][q]-a[i][q]*qwq;
				}
			}
			iac[j]=i;
			freeopen[j]=0;
		}else{
			--i;
		}
		++j;
		for (int j=1;j<=n;++j){
			bool f=1;
			for (int k=1;k<=m;++k){
				if (a[j][k]){f=0;break;}
			}
			if (f && a[j][m+1]){
				cout<<"qwq\n";
				exit(11);
			}
		}
	}
}
int main(){
	int q;
	cin >> n >> q;m=n;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=n;++j)
			cin >> w[i][j];
	double p=1.0*(n-1)/n;
	for (int i=1;i<n;++i){
		modify(i,i,1-n);
		for (int j=1;j<=n;++j){
			if (j==i) continue;
			modify(i,j,w[i][j]); 
			modify(i,i,w[i][j]);
		}		
	}
	// for ()
	for (int i=1;i<=n+1;++i) modify(n,i,1);
//	for (int i=1;i<=n+1;++i){
//		for (int j=1;j<=n+1;++j){
//			printf("%.3lf ",a[i][j]);
//		}
//		cout<<endl;
//	}
	// ++n;
	solve();
	// --n;
	for (int i=1;i<=n;++i) ans[i]=a[iac[i]][m+1]/a[iac[i]][i];
//	for (int i=1;i<=n;++i){
//		printf("%.10lf\n",ans[i]);
//	}
	string str;
	for (int i=1;i<=q;++i){
		cin >> str;
		double res=0;
		for (int j=1;j<=n;++j){//组合
			if (str[j-1]=='1') res+=ans[j];
		}
		printf("%.7lf\n",res);
	}
	cout.flush();
	return 0;
}

WA 0?

2024/11/22 22:04
加载中...