2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛

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;
}

你可能感兴趣的:(#,专题,科技,算法,c++)