2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛
A - PUBG
BFS通过优先队列优化,每次取出当前距离最小的点,向四个方向扩散,然后加进队列,最后输出-2
点的权值
#include
using namespace std;
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int N = 110;
int a[N][N];
bool st[N][N];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
signed main()
{
int n;
while(cin>>n)
{
priority_queue<PIII,vector<PIII>,greater<PIII>> Q;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]==-1) Q.push({0,{i,j}});
}
memset(st,false,sizeof st);
while(!Q.empty())
{
PIII t=Q.top();Q.pop();
int distance=t.first;
for(int i=0;i<4;i++)
{
int x=t.second.first+dx[i];
int y=t.second.second+dy[i];
if(x<1 || x>n || y<1 || y>n) continue;
if(st[x][y]) continue;
st[x][y]=1;
if(a[x][y]==-2) cout<<distance<<endl;
int dist=distance+a[x][y];
Q.push({dist,{x,y}});
}
}
}
return 0;
}
B - precise math function
#include
using namespace std;
const double PI = acos(-1);
signed main()
{
int T;scanf("%d",&T);
while(T--)
{
double n;scanf("%lf",&n);
int x;scanf("%d",&x);
printf("%.*f\n",x,pow(n,PI));
}
return 0;
}
D - 打篮球
简单模拟一下,1,2,3。
#include
using namespace std;
signed main()
{
int n;
while(cin>>n)
{
set<int> b{1,2};
bool ok=false;
for(int i=1;i<=n;i++)
{
int x;cin>>x;
if(ok) continue;
if(!b.count(x))
{
ok=true;
continue;
}
else
{
int sum=6,k;
for(auto &p:b)
{
if(p!=x) k=p;
sum-=p;
}
b.erase(k);
b.insert(sum);
}
}
if(ok) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
E - 233
高精度 A * B ,用Java直接水过
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while(T -- > 0)
{
BigInteger a = sc.nextBigInteger();
BigInteger b = sc.nextBigInteger();
System.out.println(a.multiply(b));
}
}
}
F - 扫雷
对于每个当前点,进行一次BFS遍历,将所有的.
变成0
即可
#include
using namespace std;
typedef pair<int,int> PII;
const int N = 510;
char g[N][N];
bool st[N][N];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int main()
{
int T;cin>>T;
while(T--)
{
int n,m,k;cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>(g[i]+1);
memset(st,false,sizeof st);
int ok=0;
for(int i=1;i<=k;i++)
{
int x,y;cin>>x>>y;
if(ok) continue;
if(g[x][y]=='*') ok=i;
else
{
if(g[x][y]=='.') g[x][y]='0';
queue<PII> Q;
Q.push({x,y});
st[x][y]=true;
while(!Q.empty())
{
PII t=Q.front();Q.pop();
for(int i=0;i<4;i++)
{
int xx=t.first+dx[i],yy=t.second+dy[i];
if(xx<1 || xx>n || yy<1 || yy>m) continue;
if(st[xx][yy]) continue;
st[xx][yy]=true;
if(g[xx][yy]=='.') g[xx][yy]='0';
Q.push({xx,yy});
}
}
}
}
if(ok!=0) cout<<"Game over in step "<<ok<<endl;
else
{
for(int i=1;i<=n;i++)
cout<<(g[i]+1)<<endl;
}
}
return 0;
}
G - 火车上的2连座
简单模拟一下,找到a[0],[1]
,或者a[3],a[4]
是否为O
即可
#include
using namespace std;
signed main()
{
int n;
while(cin>>n)
{
vector<string> a(n);
for(auto &ai:a) cin>>ai;
bool ok=false;
for(auto &ai:a)
{
if(ai[0]=='O' && ai[1]=='O')
{
ai[0]=ai[1]='+';
ok=true;
break;
}
if(ai[3]=='O' && ai[4]=='O')
{
ai[3]=ai[4]='+';
ok=true;
break;
}
}
if(!ok) cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(auto ai:a)
cout<<ai<<endl;
}
}
return 0;
}
H - 程序员的好印象
最长上升子序列模板题,把严格上升子序列改成非严格上升即可
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> a(n+1),f(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
if(a[i]>=a[j])
f[i]=max(f[i],f[j]+1);
}
int res=0;
for(int i=1;i<=n;i++) res=max(res,f[i]);
cout<<res<<endl;
}
return 0;
}