题解 2020/08/20 PJ组考试AK

\(T1\)


这是一道非常简单的模拟题,只要把次数取个\(\huge\text{%}\)即可。
提示:记得开\(\texttt{long long}\)

#include<bits/stdc++.h>
using namespace std;
string S;
long long N;
int main(void)
{
	register int i;
	register long long Len;
	cin>>S>>N;
	Len=S.size();
	N%=Len;
	for(i=Len-N;i<Len;i++)
	{
		cout<<S[i];
	}
	for(i=0;i<Len-N;i++)
	{
		cout<<S[i];
	}
	cout<<endl;
	return 0;
}

\(T2\)


这道题目数据非常,所以我们可以乱搞
首先,我们把所有人都加进来,然后看看有没有人可交流的人数小于\(k\)

  • 如果有,就把他删掉,然后继续前一个步骤,注意:所有想和他交流的人都不能和他交流,因为他被踢了。
  • 如果没有,结束程序吧!

然后输出即可。
其实很简单,不知道为什么有人考试这道题没想到。

#include<bits/stdc++.h>
using namespace std;
int Total,Mi;
int Size[201];
bool Visit[201];
int Array[201][201];
int main(void)
{
	register int i,j,k;
	cin>>Total>>Mi;
	for(i=1;i<=Total;i++)
	{
		register int X;
		Size[i]=0;
		while(cin>>X&&X)
		{
			Array[i][++Size[i]]=X;
		}
	}
	for(i=Total;i>=1;i--)
	{
		register bool Flag;
		Flag=false;
		register int P;
		for(j=1;j<=Total;j++)
		{
			if(Visit[j])
			{
				continue;
			}
			register int Sum;
			Sum=0;
			for(k=1;k<=Size[j];k++)
			{
				if(!Visit[Array[j][k]])
				{
					Sum++;
				}
			}
			if(Sum<Mi)
			{
				Visit[j]=true;
				Flag=true;
				break;
			}
		}
		if(!Flag)
		{
			cout<<i<<endl;
			return 0; 
		}
	}
	cout<<0<<endl;
	return 0;
}

\(T3\)



这道题目,我们以学校为原点,构造平面直角坐标系
那么,每个学生相对于学校的位置有八种情况:

如图,即:

  • 第一象限
  • 第二象限
  • 第三象限
  • 第四象限
  • \(x\)轴正半轴
  • \(y\)轴负半轴
  • \(x\)轴正半轴
  • \(y\)轴负半轴

然后,我们不难得出结论:营地建在坐标轴上较好。
因为相邻两个象限和本轴都可以经过这里。
然后就可以去敲代码啦~

#include<bits/stdc++.h>
using namespace std;
int Total;
int SchoolX,SchoolY;
int main(void)
{
	register int i;
	cin>>Total;
	cin>>SchoolX>>SchoolY;
	register int Sum1,Sum2,Sum3,Sum4;
	Sum1=Sum2=Sum3=Sum4=0;
	register int Cnt1,Cnt2,Cnt3,Cnt4;
	Cnt1=Cnt2=Cnt3=Cnt4=0;
	for(i=1;i<=Total;i++)
	{
		register int X,Y;
		cin>>X>>Y;
		if(X<SchoolX&&Y<SchoolY)
		{
			Sum1++;
		}
		if(X>SchoolX&&Y>SchoolY)
		{
			Sum2++;
		}
		if(X>SchoolX&&Y<SchoolY)
		{
			Sum3++;
		}
		if(X<SchoolX&&Y>SchoolY)
		{
			Sum4++;
		}
		if(X==SchoolX&&Y>SchoolY)
		{
			Cnt1++;
		}
		if(X>SchoolX&&Y==SchoolY)
		{
			Cnt2++;
		}
		if(X==SchoolX&&Y<SchoolY)
		{
			Cnt3++;
		}
		if(X<SchoolX&&Y==SchoolY)
		{
			Cnt4++;
		}
	}
	cout<<max(max(Sum1+Sum3+Cnt3,Sum2+Sum3+Cnt2),max(Sum2+Sum4+Cnt1,Sum1+Sum4+Cnt4))<<endl;
	return 0;
}

\(T4\)



这是一道搜索题,由于是求最短路径,所以我们考虑使用\(\mathbb{BFS}\)
我们需要考虑的元素有:

  • 当前人的位置
  • 当前箱子的位置
  • 当前所用的步数

然后做一遍\(\mathbb{BFS}\),注意只有当人旁边有箱子时,箱子才会动。

#include<bits/stdc++.h>
using namespace std;
struct Struct
{
	int PeoX;
	int PeoY;
	int BoxX;
	int BoxY;
	int Step;
};
int Case;
int Line,Column;
int Map[11][11];
bool  Visit[11][11][11][11];
int Dir[4][2]={1,0,0,1,-1,0,0,-1};
int main(void)
{
	register int i,j;
	cin>>Case;
	while(Case--)
	{
		register int StartX,StartY;
		register int EndX,EndY;
		register int StartBoxX,StartBoxY;
		cin>>Line>>Column;
		for(i=1;i<=Line;i++)
		{
			for(j=1;j<=Column;j++)
			{
				cin>>Map[i][j];
				if(Map[i][j]==2)
				{
					StartBoxX=i;
					StartBoxY=j;
				}
				if(Map[i][j]==3)
				{
					EndX=i;
					EndY=j;
				}
				if(Map[i][j]==4)
				{
					StartX=i;
					StartY=j;
				}
			}
		}
		register queue< Struct >Queue;
		while(!Queue.empty())
		{
			Queue.pop();
		}
		Queue.push(Struct{StartX,StartY,StartBoxX,StartBoxY,0});
		Visit[StartX][StartY][StartBoxX][StartBoxY]=true;
		register bool Flag;
		Flag=false;
		while(!Queue.empty())
		{
			register Struct Top;
			Top=Queue.front();
			Queue.pop();
			if(Top.BoxX==EndX&&Top.BoxY==EndY)
			{
				cout<<Top.Step<<endl;
				Flag=true;
				break;
			}
			for(i=0;i<4;i++)
			{
				register int NextX,NextY;
				NextX=Top.PeoX+Dir[i][0];
				NextY=Top.PeoY+Dir[i][1];
				if(NextX>0&&NextY>0&&NextX<=Line&&NextY<=Column&&!Visit[NextX][NextY][Top.BoxX][Top.BoxY]&&Map[NextX][NextY]!=1&&(NextX!=Top.BoxX||NextY!=Top.BoxY))
				{
					Visit[NextX][NextY][Top.BoxX][Top.BoxY]=true;
					Queue.push(Struct{NextX,NextY,Top.BoxX,Top.BoxY,Top.Step});
				}
			}
			for(i=0;i<4;i++)
			{
				register int NextX,NextY;
				NextX=Top.PeoX+Dir[i][0];
				NextY=Top.PeoY+Dir[i][1];
				if(NextX>0&&NextY>0&&NextX<=Line&&NextY<=Column&&!Visit[NextX][NextY][Top.BoxX][Top.BoxY]&&Map[NextX][NextY]!=1&&NextX==Top.BoxX&&NextY==Top.BoxY)
				{
					register int WillX,WillY;
					WillX=NextX+Dir[i][0];
					WillY=NextY+Dir[i][1];
					if(WillX>0&&WillY>0&&WillX<=Line&&WillY<=Column&&!Visit[NextX][NextY][WillX][WillY]&&Map[WillX][WillY]!=1)
					{
						Visit[NextX][NextY][WillX][WillY]=true;
						Queue.push({NextX,NextY,WillX,WillY,Top.Step+1});
					}
				}
			}
		}
		if(!Flag)
		{
			cout<<-1<<endl;
		}
		memset(Visit,false,sizeof(Visit));
	}
	return 0;
}
posted @ 2020-08-20 09:29  Bushuai_Tang  阅读(202)  评论(0编辑  收藏  举报