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

本文提供了多个ACM竞赛中常见算法问题的解决方案,包括最短路径、数学运算、字符串处理等,通过具体代码实例展示了如何使用C++、Java等语言进行高效编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.nowcoder.com/acm/contest/118#question


A


#include <iostream>
#include<stdio.h>
#include <string.h>
#include <algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
struct node
{
    int x,y;
};
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int n;
int a[105][105];
bool vis[105][105];
int sx,sy,ex,ey;
int dis[105][105];
bool check(int x,int y)
{
    if(x<=0||x>n||y<=0||y>n)return false;
    return true;
}
int bfs()
{
    node q,p;
    queue<node>Q;
    memset(dis, inf, sizeof(dis));
    q.x=sx;
    q.y=sy;
    dis[sx][sy]=0;
    Q.push(q);
    memset(vis, false, sizeof(vis));
    vis[sx][sy]=true;
    //int k=0;
    while (!Q.empty()) {
        p=Q.front();
        Q.pop();
        vis[p.x][p.y]=0;
        for(int i=0;i<4;i++)
        {
            q.x=p.x+dir[i][0];
            q.y=p.y+dir[i][1];
             
            if(!check(q.x, q.y))continue;
            //cout<<p.x<<' '<<p.y<<' '<<q.x<<' '<<q.y<<endl;
            if(dis[q.x][q.y]>dis[p.x][p.y]+a[q.x][q.y])
            {
                dis[q.x][q.y]=dis[p.x][p.y]+a[q.x][q.y];
                //cout<<k++<<' '<<dis[q.x][q.y]<<' '<<q.x<<' '<<q.y<<endl;
                if(!vis[q.x][q.y])
                {
                    vis[q.x][q.y]=1;
                    Q.push(q);
                }
            }
        }
    }
    //cout<<999<<endl;
    int minn=inf;
    for(int i=0;i<4;i++)
    {
        int x=ex+dir[i][0];
        int y=ey+dir[i][1];
        if(!check(x, y))continue;
        minn=min(dis[x][y],minn);
    }
    return minn;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&a[i][j]);
                if(a[i][j]==-1)
                {
                    a[i][j]=inf;
                    sx=i;
                    sy=j;
                }
                if(a[i][j]==-2)
                {
                    a[i][j]=inf;
                    ex=i;
                    ey=j;
                }
            }
        }
        //cout<<0<<endl;
        int ans=bfs();
        //cout<<dis[ex][ey]<<endl;
        printf("%d\n",ans);
    }
    return 0;
}

B



#include<bits/stdc++.h>
using namespace std;
double pi=acos(-1.0);
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        double a;
        int b;
        cin>>a>>b;
        double ans=pow(a,pi);
        cout<<setprecision(b)<<fixed<<ans<<endl;
    }
    return 0;
}

D


#include<bits/stdc++.h>
using namespace std;
double pi=acos(-1.0);
int main(){
    int n;
    while(cin>>n)
    {
        int a[111];
        for(int i=0;i<n;i++)
        cin>>a[i];
        int f[4]={0,1,1,0};
        int f1=0;
        for(int i=0;i<n;i++)
        {
            if(f[1]==f[2]&&f[2]==f[3])
            {
                f1=1;
                cout<<"NO"<<endl;
                break;
            }
            if(f[a[i]]==0)
            {
                f1=1;
                cout<<"NO"<<endl;
                break;
            }
            if(a[i]==1)
            {
                if(f[2]==1)
                f[2]=0,f[3]=1;
                else f[3]=0,f[2]=1;
            }
			else if(a[i]==2)
			{ if(f[1]==1) 
			f[1]=0,f[3]=1; 
			else 
			f[3]=0,f[1]=1;
			 }
			  else if(a[i]==3) 
			  { 
			  if(f[2]==1) 
			  f[2]=0,f[1]=1; 
			  else 
			  f[1]=0,f[2]=1;
			   }
		} 
		if(f1==0) 
		cout<<"YES"<<endl;
	 } 
return 0;
}

E

import java.util.*;
import java.math.*;
 
public class Main {
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        int T = cin.nextInt();
        for(int i = 0; i < T; ++i)
        {
            BigInteger n = cin.nextBigInteger();
            BigInteger m = cin.nextBigInteger();
            BigInteger ans=n.multiply(m);
            System.out.println(ans);
        }
    }
 
}

F



#include<bits/stdc++.h>
using namespace std;
char ma[555][555];
char ans[555][555];
bool vis[555][555];
int n,m,k;
bool check(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m||vis[x][y]==1)
    return 0;
    return 1;
}
void dfs(int x,int y)
{
    if(ma[x][y]=='*')return ;
    ans[x][y]=ma[x][y];
    vis[x][y]=1;
    if(ans[x][y]=='.')ans[x][y]='0';
    if(ma[x][y]!='.')return ;
    if(check(x+1,y))
    {
        dfs(x+1,y);
    }
    if(check(x,y+1))
    {
        dfs(x,y+1);
    }
    if(check(x-1,y))
    {
        dfs(x-1,y);
    }
    if(check(x,y-1))
    {
        dfs(x,y-1);
    }
}
int main(){
  int t;
  cin>>t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<n;i++)
        scanf("%s",ma[i]);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            ans[i][j]='.';
        }
        int x[11],y[11];
        for(int i=0;i<k;i++)
        {
            cin>>x[i]>>y[i];
            x[i]--;
            y[i]--;
        }
        int f1=0;
        for(int i=0;i<k;i++)
        {
            if(ma[x[i]][y[i]]=='*')
            {
                f1=1;
                cout<<"Game over in step "<<i+1<<endl;
                break;
            }
            else if(ma[x[i]][y[i]]=='.')
            {
                 
                dfs(x[i],y[i]);
            }
            else ans[x[i]][y[i]]=ma[x[i]][y[i]];
        }
        if(f1==0)
        {
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                printf("%c",ans[i][j]);
                cout<<endl;
            }
        }
    }
    return 0;
}

G



#include<bits/stdc++.h>
using namespace std;
double pi=acos(-1.0);
int main(){
    int n;
    char a[1111][7];
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        cin>>a[i];
        int f=1;
        for(int i=0;i<n;i++)
        {
            if(a[i][0]=='O'&&a[i][1]=='O')
            {
                f=0;
                a[i][0]='+';
                a[i][1]='+';
                break;
            }
            if(a[i][3]=='O'&&a[i][4]=='O')
            {
                f=0;
                a[i][3]='+';
                a[i][4]='+';
                break;
            }
        }
        if(f==0)
        {
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++)
            cout<<a[i]<<endl;
        }
        else cout<<"NO"<<endl;
    }
    return 0;
}

H




#include<bits/stdc++.h>
using namespace std;
double pi=acos(-1.0);
int a[111];
int main(){
  int n;
    while(cin>>n)
    {
        int ans=0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(a[i]==0)ans++;
        }
        for(int i=0;i<n;i++)
        {
             if(a[i]==1)
             {
                int z=0;
                int y=0;
                for(int j=i-1;j>=0;j--)
                if(a[j]==0)z++;
                for(int j=i+1;j<n;j++)
                if(a[j]==1)y++;
                ans=max(ans,z+y+1);
             }
        }
        cout<<ans<<endl;
    }
    return 0;
}

I



#include<bits/stdc++.h>
using namespace std;
int n,k;
double l,v1,v2;
double eps=1e-11;
bool check(double x)
{
    double qux=v2*((l-v1*x)/(v2-v1));
    double qut=qux/v2;
    double huit=(qux-qut*v1)/(v1+v2);
    double renx=qux-v2*huit;
    double zx=0;
    double zt=0;
    if(!(n%k))
    {
        double ts=n/k;
        zt+=ts*(qut+huit);
        zt-=huit;
        zx+=(ts-1)*renx;
        zx+=qux;
    }
    else
    {
        int ts=n/k;
        zt+=ts*1.0*(qut+huit);
        zt+=qut;
        zx+=ts*1.0*renx;
        zx+=qux;
    }
    if(zt-x>eps)
    return 0;
    double wx=x-zt;
    zx+=wx*v2;
    if(zx-l>=eps)return 1;
    return 0;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%d%lf%lf%lf%d",&n,&l,&v1,&v2,&k);
        double left=l/v2;
        double right=l/v1;
        while(right-left>eps)
        {
            double mid=(left+right)/2.0;
            if(check(mid))
            {
                right=mid;
            }
            else
            {
                left=mid;
            }
        }
        printf("%.10lf\n",left);
    }
    return 0;
}

J



#include<bits/stdc++.h>
using namespace std;
double pi=acos(-1.0);
int main(){
  int t;
  cin>>t;
    while(t--)
    {
        double a,b,c;
        cin>>a>>b>>c;
        if(a==0)
        {
            cout<<"0.0000000000"<<endl;
            continue;
        }
        if(b<=c)
        {
            cout<<"Infinity"<<endl;
        }
        else {
            double ans=(a*b)/(b*b-c*c);
            printf("%.10lf\n",ans);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值