2017年西南民族大学程序设计竞赛-网络同步赛

本文精选了多道算法题目并提供了详细的解题思路及代码实现,包括A星图搜索、好数判断、贪心策略等典型问题,适用于算法初学者及竞赛选手。

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

A星图

思路:利用前缀数组的特点,

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
char map[1005][1005];
int mmp[1005][1005];
int mdp[1005][1005];
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
           cin>>map[i][j];
            if(map[i][j]=='#')mmp[i][j]=mmp[i][j-1]+1;
            else mmp[i][j]=mmp[i][j-1];
        }

    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
           if(map[j][i]=='#')mdp[j][i]=mdp[j-1][i]+1;
           else mdp[j][i]=mdp[j-1][i];
        }
    }

    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<mdp[i][j]<<" ";
        }
        cout<<endl;
    }*/

     for(int j=1;j<=k;j++)
    {

        int q,w;
        char a[5];
        scanf("%d%d%s",&q,&w,a);
        if(a[0]=='L')
        {


            if(mmp[q][w]==0)printf("YES\n");
            else printf("NO\n");
        }
        else if(a[0]=='R')
        {
            int sum=mmp[q][m]-mmp[q][w-1];

            if(sum==0)printf("YES\n");
            else printf("NO\n");
        }
        else if(a[0]=='U')
        {
            //cout<<mdp[q][w]<<endl;

            if(mdp[q][w]==0)printf("YES\n");
            else printf("NO\n");
        }
        else
        {
            int sum=mdp[n][w]-mdp[q-1][w];

            if(sum==0)printf("YES\n");
            else printf("NO\n");
        }
    }

    return 0;
}

B 好数

暴力

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int main()
{
   string n;
   getline(cin,n);

    int f=0;
    for(int i=1;i<n.size();i++)
    {
        if(n[i]!=n[i-1])
        {
            f=1;
            break;
        }
    }
    if(f)printf("NO\n");
    else printf("YES\n");

    return 0;
}


C 装进肚子

贪心

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[100005],b[100005],c[100005];
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
       for(int i=1;i<=n;i++)
       {
           scanf("%d",&a[i]);
       }
       long long sum=0;
       for(int i=1;i<=n;i++)
       {
           scanf("%d",&b[i]);
           sum+=b[i];
           c[i]=b[i]-a[i];
       }
       sort(c+1,c+n+1);
       for(int i=1;i<=k;i++)
       {
           sum-=c[i];
       }
       cout<<sum<<endl;
    }


}

D ZZZZone爱吃糖

数组的前缀和

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
long long sum[10005];
long long v[10005];
long long dp[10005];
int main()
{

    int n;
    while(~scanf("%d",&n))
    {
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            int q;
            scanf("%d",&q);
            sum[i]=sum[i-1]+q;
        }
        //for(int i=1;i<=n;i++)cout<<sum[i]<<" ";cout<<endl;
        int m;
        cin>>m;
        for(int i=1;i<=m;i++)
        {
            int q,w;
            scanf("%d%d",&q,&w);
            v[i]=sum[w]-sum[q-1];
        }
        //for(int i=1;i<=m;i++)
        //cout<<v[i]<<" ";
        //cout<<endl;

        for(int i=1;i<=m;i++)
        {
            if(v[i]>0)dp[i]=dp[i-1]+v[i];
            else dp[i]=dp[i-1];
        }
        cout<<dp[m]<<endl;

    }
    return 0;
}


E 开心的涂刷

数学乘法原理  用快速幂

代码:

#include <iostream>
#define LL long long
using namespace std;
const int mod=1e9+7;
LL pow(LL a,LL b)
{
    if(a==0)return 0;
    a%=mod;
    LL ans=1;
    while(b>0)
    {
        if(b&1)ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    LL n,m;
    cin>>n>>m;
    LL ans=pow(m,n);
    LL ma= (m%mod)*(pow(m-1,n-1))%mod;
    cout<<(ans-ma+mod)%mod<<endl;
    return 0;
}


F 兼职数靶

暴力

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
double map[13][13]={1,1,1,1,1,1,1,1,1,1,1,1,1,
               1 ,2 ,2 ,2 ,2 ,2 ,2, 2, 2 ,2, 2 ,2, 1,
               1 ,2, 2 ,2 ,2 ,2 ,2 ,2 ,2, 2, 2, 2, 1,
               1 ,2, 2, 3 ,3 ,3 ,3 ,3 ,3, 3 ,2 ,2 ,1,
               1 ,2, 2, 3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
               1 ,2, 2, 3 ,3 ,4 ,4 ,4 ,3 ,3 ,2, 2 ,1,
               1 ,2, 2 ,3 ,3 ,4 ,4 ,4 ,3 ,3 ,2, 2 ,1,
               1 ,2, 2 ,3 ,3 ,4 ,4 ,4 ,3 ,3 ,2 ,2 ,1,
               1 ,2, 2 ,3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
               1 ,2, 2 ,3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
               1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1,
               1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1,
               1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1, 1};



int main()
{

    int n;
    while(scanf("%d",&n)&&n)
    {
        char a;
        double sum=0;
        for(int i=0;i<13;i++)
        {
            for(int j=0;j<13;j++)
            {
                cin>>a;
                if(a=='#'){sum+=map[i][j];}
            }
        }

        double ans=sum/n;
        printf("%.2lf\n",ans);

    }


    return 0;
}

G 卡牌游戏

暴力判断

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;


int main()
{
    int n;
    int q=0,w=0;
    cin>>n;
    string a,b;
    string j="Jin",m="Mu",s="Shui",h="Huo",t="Tu";
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b;
        if(a==j&&b==m)q+=3;
        else
        if(a==m&&b==t)q+=3;
        else
        if(a==t&&b==s)q+=3;
        else
        if(a==s&&b==h)q+=3;
        else
        if(a==h&&b==j)q+=3;
        else
        if(b==j&&a==m)w+=3;
        else
        if(b==m&&a==t)w+=3;
        else
        if(b==t&&a==s)w+=3;
        else
        if(b==s&&a==h)w+=3;
        else
        if(b==h&&a==j)w+=3;
        else {q++;w++;}

    }
    if(q>w)cout<<"Alice"<<endl;
    else if(q==w)
    {
        cout<<"Draw"<<endl;
    }
    else
    {
       cout<<"Bob"<<endl;
    }


    return 0;
}


H Hungry!

看故事

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;


int main()
{
    int n;
    
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            printf("gu...");
        }
        printf("\n");
        printf("The story is so boring. And I am so hungry!\n");
    }

    return 0;
}

I 快饿死的XzzF

dp一下,打表

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int dp[22][2];
void q()
{
    dp[1][1]=1;
    dp[1][0]=1;
    for(int i=1;i<=20;i++)
    {
        for(int j=0;j<=1;j++)
        {
            if(j)
            {
                dp[i+1][0]+=dp[i][j];
                dp[i+1][1]+=dp[i][j];
            }
            else
            {
                dp[i+1][1]+=dp[i][j];
            }

        }
    }
}
int main()
{
    int n;
    q();
    while(~scanf("%d",&n))
    {
        cout<<dp[n][0]+dp[n][1]<<endl;
    }

    return 0;
}

J 小猪佩奇练打字

题目怎么说就怎么做

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[130];
int v[130][130];
int main()
{
       char s[100005];

       while(~scanf("%s",s))
       {
        memset(a,0,sizeof(a));

        int n;
        cin>>n;
        for(int i=1;i<=122;i++)
        {

            a[i]=i;
        }
        for(int i=1;i<=n;i++)
        {
            char q,w;
            cin>>q>>w;
            int qq=q,ww=w;
            int n=a[qq];
            a[qq]=a[ww];
            a[ww]=n;
        }
        char ss[100005];
        int end=strlen(s);
        for(int i=0;i<end;i++)
        {
            int e=s[i];
            ss[i]=a[e];
        }
        for(int i=0;i<end;i++)
        cout<<ss[i];
        cout<<endl;


       }

    return 0;
}


K 免费WiFi

其实直接暴力,找最大就可以,我蛋疼用的树状数组区间更新。

代码:


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;


long long c[10005];

long long lowbit(long long x)
{
    return x&(-x);
}
void add(long long x,long long v)
{
    while(x<=10001)
    {
        c[x]+=v;
        x=x+lowbit(x);
    }
}

long long sum(int x)
{
    long long su=0;
    while(x>0)
    {
        su+=c[x];
        x-=lowbit(x);
    }
    return su;
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {   memset(c,0,sizeof(c));

        int qq=0,ww=5500;
        for(int i=1;i<=n;i++)
        {
            long long q,w;
             scanf("%I64d%I64d",&q,&w);
             add(q,1);
             add(w+1,-1);
             if(q>qq)qq=q;
             if(q<ww)ww=q;
             if(w>qq)qq=w;
             if(w<ww)ww=w;
        }
        int ma=0;
        for(int i=ww;i<=qq;i++)
        {

            long long su=sum(i);
            if(su>ma)ma=su;

        }
        int mi=ma%m;
        if(mi)cout<<ma/m+1<<endl;
        else cout<<ma/m<<endl;

    }

    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值