亂搞..
首先X是一個遞增的序列,所以最小的兩個和一定是x1+x2,x1+x3 但是我們還需要x2+x3才能解出這三個數(shù),而x2+x3有n-1種可能的值,不能確定,因為n不大,可以枚舉x2+x3是哪個值,然后解出這三個值后可以解出其他的所有值,判一下是否合法即可
code:
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 310;int x[maxn],n;int s[maxn*maxn];int ans[maxn][maxn],at;multiset<int>S;multiset<int>::iterator it;int main(){ scanf("%d",&n); int m=n*(n-1)/2; for(int i=1;i<=m;i++) scanf("%d",&s[i]); sort(s+1,s+m+1); at=0; for(int i=n;i>=3;i--) { if(i<n&&s[i]==s[i+1]) continue; x[1]=(s[1]+s[2]-s[i])>>1; if(x[1]*2!=s[1]+s[2]-s[i]) continue; if(x[1]<=0) continue; x[2]=s[1]-x[1]; if(x[2]<=x[1]) continue; x[3]=s[2]-x[1]; if(x[3]<=x[2]) continue; S.clear(); S.insert(-1); S.insert(1e9+1); for(int j=3;j<=m;j++) if(i!=j) S.insert(s[j]); int nw=4; while(nw<=n) { it=S.upper_bound(-1); x[nw]=(*it)-x[1]; if(x[nw]<=x[nw-1]) break; int j; for(j=1;j<nw;j++) { it=S.lower_bound(x[j]+x[nw]); if((*it)!=x[j]+x[nw]) break; S.erase(it); } if(j!=nw) break; nw++; } if(nw<=n) continue; at++; for(int j=1;j<=n;j++) ans[at][j]=x[j]; }新聞熱點
疑難解答