题解:2009-2010 ACM-ICPC Northeastern European Regional Contest (NEERC 09)

版权声明:本文为博主原创文章,欢迎转载并注明来源。 https://blog.csdn.net/w_weilan/article/details/82951793

Asteroids

模板题,求两空间多面体重心最近的距离,将重心到所在凸包表面的最短距离相加即可。

#include<bits/stdc++.h>
using namespace std;
typedef double lf;
const lf EPS=1e-9,INF=1e9;
struct Coord3
{
	lf X,Y,Z;
	Coord3(lf X=0,lf Y=0,lf Z=0):X(X),Y(Y),Z(Z) {}
};

int sgn(lf d)
{
	return (d>EPS)-(d<-EPS);
}

Coord3& operator+=(Coord3 &a,const Coord3 &b)
{
	return a.X+=b.X,a.Y+=b.Y,a.Z+=b.Z,a;
}
Coord3 operator+(Coord3 a,const Coord3 &b)
{
	return a+=b;
}

Coord3& operator-=(Coord3 &a,const Coord3 &b)
{
	return a.X-=b.X,a.Y-=b.Y,a.Z-=b.Z,a;
}
Coord3 operator-(Coord3 a,const Coord3 &b)
{
	return a-=b;
}

Coord3& operator*=(Coord3 &a,lf d)
{
	return a.X*=d,a.Y*=d,a.Z*=d,a;
}
Coord3 operator*(Coord3 a,lf d)
{
	return a*=d;
}
Coord3 operator*(lf d,Coord3 a)
{
	return a*=d;
}

Coord3& operator/=(Coord3 &a,lf d)
{
	return a.X/=d,a.Y/=d,a.Z/=d,a;
}
Coord3 operator/(Coord3 a,lf d)
{
	return a/=d;
}

lf Dot(const Coord3& A,const Coord3& B)
{
	return A.X*B.X+A.Y*B.Y+A.Z*B.Z;
}

Coord3 Cross(const Coord3& A,const Coord3& B)
{
	return Coord3(A.Y*B.Z-A.Z*B.Y,A.Z*B.X-A.X*B.Z,A.X*B.Y-A.Y*B.X);
}

lf norm(const Coord3& A)
{
	return Dot(A,A);
}

lf abs(const Coord3& A)
{
	return sqrt(norm(A));
}

lf Area2(const Coord3& A,const Coord3& B,const Coord3& C)
{
	return abs(Cross(B-A,C-A));
}

lf Volume6(const Coord3& A,const Coord3& B,const Coord3& C,const Coord3& D)
{
	return Dot(D-A,Cross(B-A,C-A));
}

Coord3 Centroid(const Coord3& A,const Coord3& B,const Coord3& C,const Coord3& D)
{
	return (A+B+C+D)/4.0;
}

struct ConvexPolyhedron
{
	struct Face
	{
		int v[3];
		Face(int a,int b,int c)
		{
			v[0]=a,v[1]=b,v[2]=c;
		}
		Coord3 Normal(const vector<Coord3>& P)
		{
			return Cross(P[v[1]]-P[v[0]],P[v[2]]-P[v[0]]);
		}
		bool CanSee(const vector<Coord3>& P,int i)
		{
			return Dot(P[i]-P[v[0]],Normal(P))>0;
		}
	};
	vector<Face> faces;
	vector<Coord3> p;
	ConvexPolyhedron(vector<Coord3> P):p(P)
	{
		for(int i=0; i<p.size(); ++i)P[i]+=Coord3(randEPS(),randEPS(),randEPS());
		vector<vector<int> > vis(P.size(),vector<int>(P.size()));
		faces.push_back(Face(0,1,2));
		faces.push_back(Face(2,1,0));
		for(int i=3; i<P.size(); ++i)
		{
			vector<Face> next;
			for(int j=0; j<faces.size(); ++j)
			{
				Face& f=faces[j];
				int res=f.CanSee(P,i);
				if(!res)next.push_back(f);
				for(int k=0; k<3; ++k)vis[f.v[k]][f.v[(k+1)%3]]=res;
			}
			for(int j=0; j<faces.size(); ++j)
				for(int k=0; k<3; ++k)
				{
					int a=faces[j].v[k],b=faces[j].v[(k+1)%3];
					if(vis[a][b]!=vis[b][a]&&vis[a][b])
						next.push_back(Face(a,b,i));
				}
			swap(faces,next);
		}
	}
	lf randEPS()
	{
		return (rand()/lf(RAND_MAX)-0.5)*EPS;
	}
	Coord3 centroid()
	{
		Coord3 C=p[0],tot(0,0,0);
		lf totv=0;
		for(int i=0; i<faces.size(); ++i)
		{
			Coord3 p1=p[faces[i].v[0]],p2=p[faces[i].v[1]],p3=p[faces[i].v[2]];
			lf v=-Volume6(p1,p2,p3,C);
			totv+=v;
			tot+=v*Centroid(p1,p2,p3,C);
		}
		return tot/totv;
	}
	lf dist(const Coord3& C)
	{
		lf ans=INF;
		for(int i=0; i<faces.size(); ++i)
		{
			Coord3 p1=p[faces[i].v[0]],p2=p[faces[i].v[1]],p3=p[faces[i].v[2]];
			ans=min(ans,fabs(-Volume6(p1,p2,p3,C)/Area2(p1,p2,p3)));
		}
		return ans;
	}
};
int main()
{
	lf ans=0,x,y,z;
	for(int n,m,flag=1; ~scanf("%d",&n);)
	{
		vector<Coord3> p;
		for(; n--; p.push_back(Coord3(x,y,z)))
			scanf("%lf%lf%lf",&x,&y,&z);
		ConvexPolyhedron c(p);
		ans+=c.dist(c.centroid());
		if(flag^=1)printf("%.5f\n",ans),ans=0;
	}
}

Business Center

#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

int n,m;

int main()
{
	while (~scanf("%d%d",&n,&m))
	{
	int ans=1000000001;
	for (int i=1;i<=m;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int ret=(x*n)%(x+y);
		if (ret==0) ret=x+y;
		ans=min(ans,ret);
	}
	printf("%d\n",ans);
	}
}

Database

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int n,m,f; cin>>n>>m;)
	{
		unordered_map<string,set<int> > mp[15];
		string s;
		getline(cin,s);
		for(int i=f=1; i<=n; ++i)
		{
			unordered_map<int,int> mmp;
			for(int j=1; j<=m; ++j)
			{
				getline(cin,s,j<m?',':'\n');
				if(!f)continue;
				for(auto it:mp[j][s])
				{
					if(mmp.count(it))
					{
						cout<<"NO\n"<<it<<' '<<i<<'\n'<<mmp[it]<<' '<<j<<'\n';
						f=0;
						break;
					}
					mmp[it]=j;
				}
				mp[j][s].insert(i);
			}
		}
		if(f)cout<<"YES\n";
	}
}

Funny Language

#include<bits/stdc++.h>
using namespace std;
void cal(const string &s,int c[])
{
	fill(c,c+26,0);
	for(int i=0; i<s.size(); ++i)++c[s[i]-'A'];
}
string s[1023];
int c[1023][31];
int main()
{
	for(int n,m; cin>>m>>n;)
	{
		for(int i=0; i<n; ++i)
			cin>>s[i];
		sort(s,s+n);
		for(int i=0; i<n; ++i)cal(s[i],c[i]);
		priority_queue<pair<int,string> > q;
		q.push(make_pair(0,""));
		while(m)
		{
			pair<int,string> pis=q.top();
			q.pop();
			auto rg=equal_range(s,s+n,pis.second);
			if(rg.first==rg.second&&!pis.second.empty())cout<<pis.second<<'\n',--m;
			cal(pis.second,c[n]);
			for(pis.second+='A'; pis.second.back()<='Z'; ++pis.second.back())
			{
				++c[n][pis.second.back()-'A'];
				for(int i=pis.first=0; i<n; ++i)
				{
					++pis.first;
					for(int j=0; j<26; ++j)
						if(c[n][j]>c[i][j])
						{
							--pis.first;
							break;
						}
				}
				q.push(pis);
				--c[n][pis.second.back()-'A'];
			}
		}
	}
}

Headshot

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(string s; cin>>s;)
	{
		int a=s.size(),b=0,c=0,d=0;
		for(int i=0; i<a; ++i)
			if(s[i]=='0')
				++b,++c,d+=s[(i+1)%a]=='0';
		printf(a*d>b*c?"SHOOT\n":a*d<b*c?"ROTATE\n":"EQUAL\n");
	}
}

猜你喜欢

转载自blog.csdn.net/w_weilan/article/details/82951793