匪夷所思的RE
查看原帖
匪夷所思的RE
1379742
Xiaohaoyu1020明天见_xj楼主2024/8/2 23:36

先贴代码

#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int sum[N*(N-1)/2];
int vis[100010];
int a[N];
int n;
bool solve(int a1){
	for(int i = 1;i<=n*(n-1)/2;i++){
		vis[sum[i]]++;
	}
	a[1] = a1;;
	a[2] = sum[1] - a1;
	vis[sum[1]]--;

	int cnt = 2,p = vis[sum[1]]>0?1:2;
	while(cnt<n){
		a[++cnt] = sum[p] - a[1];
		for(int i = 1;i<cnt;i++){
			if(vis[a[cnt] + a[i]]){
				vis[a[cnt] + a[i]]--;
			}else{
				for(int j = 1;j<=n;j++){
					vis[sum[j]] = 0;
				}
				return false;
			}
		}
		while(vis[sum[p]]<=0)p++;
	}
	for(int i = 1;i<=n*(n-1)/2;i++){
		vis[sum[i]] = 0;
	}
	return true;
}
int main(){
	while(cin>>n){
		for(int i = 1;i<=n*(n-1)/2;i++){
			cin>>sum[i];
		}
		bool f = false;
		sort(sum+1,sum+1+n*(n-1)/2);
		for(int a1 = 0;a1<=sum[1];a1++){
			if(solve(a1)){
				f = true;
				break;
			}
		}
		if(!f){
			cout<<"Impossible"<<'\n';
			return 0;
		}
		for(int i = 1;i<=n;i++){
			cout<<a[i]<<' ';
		}
		cout<<'\n';
	}
}

经过输入输出调试样例发现在输入的时候RE炸出去了 注释掉以下代码样例会输出Imposible

vis[sum[i]]--;

我寻思着把前面for循环改成从二开始,这样正好等价 结果还是RE炸出去了

思路取自的是第一篇题解,但是把他的set改写为了一个vis数组桶计数,数组应该是开够了(包括vis的100010),但是样例只有3根本过不去

2024/8/2 23:36
加载中...