C、红魔馆的馆主
注意:如果1e18再往后加数字会爆LL,解决办法:1.使用__int128:范围是10^36;2.可以对输入取模,先对输入取模再对总的取模。(同余定理?)
思路:枚举
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
__int128 m=n;
if(m%495==0){
cout<<"-1";
return 0;
}
for(int i=0;i<=9;i++){
if((m*10+i)%495==0){
cout<<i;
return 0;
}
}
for(int i=0;i<=99;i++){
if((m*100+i)%495==0){
if(i<10) cout<<0;//两位时,小于10需要先补0
cout<<i;
return 0;
}
}
for(int i=100;i<=999;i++){
if((m*1000+i)%495==0){
cout<<i;
return 0;
}
}
}
D、迷途之家的大贤者
思路:对小红来说,她一定会把现存串中最大的元素放到最前面;对于小紫来说,她一定会把现存串中最小的元素放到最前面。而在删除时,小红一定会尽可能把小的删去,小紫则相反。所以由于小红先删,只需要看到两端的字母,哪个更大就好了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin>>n>>s;
cout<<max(s[0],s.back());
return 0;
}
E、魔法之森的蘑菇
思路:bfs+分层图;分层图是指按移动方向分成四个图,一个是向前走,一个是向左走,一个是向右走,一个是向后走。每当遇到蘑菇时,小红可以在这四个图里“穿梭”。如:当遇到蘑菇后,小红向右走(保证不掉头),则小红可以从当前方向的图,以当前图的所在位置为起点,跳到只向右走的图中继续走(bfs)。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m,l;
int dis[N][N][4];
int op[4][2]={1,0,-1,0,0,-1,0,1};
string s[N];
int main(){
cin>>l;
while(l--){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
for(int k=0;k<4;k++)//初始化
{
dis[i][j][k]=1e9;
}
int xi,yj;
queue<vector<int>>q;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(s[i][j]=='S')//把S设为起点
{
for(int k=0;k<4;k++){
q.push({i,j,k});
dis[i][j][k]=0;
}
}
if(s[i][j]=='T')xi=i,yj=j;
}
while(q.size())//bfs
{
auto t=q.front();
q.pop();
int x=t[0],y=t[1];
if(s[x][y]=='.'||s[x][y]=='T'||s[x][y]=='S')//不改变方向
{
int xx=x+op[t[2]][0],yy=y+op[t[2]][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]!='#')//不出去,不碰墙
{
if(dis[xx][yy][t[2]]>dis[x][y][t[2]]+1){
q.push({xx,yy,t[2]});
dis[xx][yy][t[2]]=dis[x][y][t[2]]+1;
}
}
}
else if(s[x][y]=='*'){
for(int i=0;i<4;i++){
if((i^t[2])==1)continue;//不能掉头
int xx=x+op[i][0],yy=y+op[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]!='#'){
if(dis[xx][yy][i]>dis[x][y][t[2]]+1){
q.push({xx,yy,i});
dis[xx][yy][i]=dis[x][y][t[2]]+1;
}
}
}
}
}
int mi=1e9;
for(int i=0;i<4;i++) mi=min(mi,dis[xi][yj][i]);
if(mi>8e8){
cout<<"-1"<<'\n';
}
else cout<<mi<<'\n';
}
return 0;
}