题解 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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!