city

code:

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n,recnt,m[45000],cnt2=0,a[45000];
vector <int> reans;
vector <int> ans[45000];
bool v[45000];
bool judge(int x){
	for(int i=0;i<n;i++)
	 for(int j=i+1;j<n;j++)
	  if(reans[i]+reans[j]==m[x])
	   return true;
	return false;
}
void push(){
	recnt++;
	for(int i=0;i<reans.size();i++)
	 ans[recnt].push_back(reans[i]);
	reans.clear();
}
void jie(int i){
	reans.push_back((m[1]-m[i]+m[2])/2);
	reans.push_back(m[1]-reans[0]);
	reans.push_back(m[2]-reans[0]);
}
int comp(int a, int b){
	for(int i=0;i<n;i++)
	 if(ans[a][i]>ans[b][i])
	  return 1;
	return 0;
}
int main(){
	freopen("city.in","r",stdin);
	freopen("city.out","w",stdout);
	scanf("%d",&n);
	memset(m,0,sizeof(m));
	for(int i=1;i<=n*(n-1)/2;i++)
	 scanf("%d",&m[i]);
	sort(m+1,m+1+n*(n-1)/2);
	for(int i=3;i<=n*(n-1)/2;i++){
		while(m[i]==m[i+1]){i++;}
		memset(v,false,sizeof(v));
	    v[1]=true;v[2]=true;v[i]=true;
		jie(i);
		bool qqq=false;
	    for(int gg=0;gg<reans.size()-1;gg++)
	     if(reans[gg]>reans[gg+1]){
	     	reans.clear();
	     	qqq=true;
	     	break;
	     }
	     if(qqq==true)
		 continue;
		for(int p=3;p<=n;p++)
		 if(v[p]==false)
		  reans.push_back(m[p]-reans[0]);
		bool t=true;
		for(int j=1;j<=n*(n-1)/2;j++)
		 if(judge(j)!=true){
		 	t=false;
		 	break;
		 }
		if(t==true)
		 push();
		else
		 reans.clear();
	}
	for(int i=1;i<=recnt;i++)
	 if(ans[i].size()!=0)
	  cnt2++;
	
	for(int i=1;i<=cnt2;i++)
	 a[i]=i;
	for(int i=1;i<cnt2;i++)
	 for(int j=1;j<cnt2;j++)
	  if(comp(a[i],a[i+1])==0){
	  	int uu;
	  	uu=a[i];
	  	a[i]=a[i+1];
	  	a[i+1]=uu;
	  }
	 printf("%d\n",cnt2);
	for(int i=1;i<=cnt2;i++){
		for(int j=0;j<n;j++)
		 printf("%d ",ans[a[i]][j]);
		printf("\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}




2days was for the city.
什么扯淡鬼题目!

idea1:wrong
sort(m)
枚举from 1 to m[1];
reans[0]=i;
reans[1]=m[2]-reans[i];
递归。
reans[i]+reans[j]==m[p]与m[p]-reans[i]==reans[j]
不能分别处理。


idea2:right:
sort(m)
ans1+ans2=m[1]
v[]=true
ans1+ans3=m[2]
v[]=true
ans2+ans3=m[i]v[]=true
解得 ans1,ans2,ans3;
a1+a4=min(m[j]&&v[j]==false)
a4.a5.a6.....
check();




posted on 2017-11-05 21:37  Sakura'duke  阅读(220)  评论(0)    收藏  举报

导航