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

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

鉴于本人技术不足可能有些题目没有做得更好,希望各位多多包涵。

A-星图

题目描述


现在有一个N*M的矩形星图。其中包括恒星和黑洞。恒星可以向上、下、左、右发射光束,且允许光束从其中穿过;黑洞会吸收所有经过的光束。
若一颗恒星向上、下、左、右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么?

输入描述:

单组输入。第一行三个正整数N,M,Q(1 <= N,M
<= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立。
然后一个N*M的矩阵,由’*’和’#’构成,表示星图。’*’表示恒星,’#’表示黑洞。
最后Q行,表示Q个询问,每行两个正整数x,y(1 <= x <= N, 1 <= y
<= M)表示发光恒星的位置(从上往下数第x行,从左往右数第y列,且保证该位置一定是恒星)和一个字符p(p∈{‘L’, ‘R’,
‘D’, ‘U’},’R’表示向右;’L’表示向左;’D’表示向下’;’U’表示向上)表示该恒星产生光束的方向。

输出描述:

一共Q行。对于每个询问,若该恒星发出的光束能够进入星图之外的区域则输出“YES”;否则输出“NO”。(不包含引号)
示例1

输入

4 5 5
**##*
*****
*#*#*
##**#
2 3 D
2 3 U
1 5 R
4 4 U
3 1 U

输出

YES
NO
YES
NO
YES
有两种做法:一维数组处理和二维数组处理,其中一维的是参考比赛时的AC的一名选手做的

贴上代码:

一维处理

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxz=1005;
int r[maxz];
int l[maxz];
int u[maxz];
int d[maxz];
int main()
{
    int i,j;
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(i=0;i<1002;i++)
    {
         u[i]=maxz;
         l[i]=maxz;
         d[i]=0;
         r[i]=0;
    }
    char ch1;
    for(i=1;i<=n;i++)
    {
        getchar();
        for(j=1;j<=m;j++)
        {
            scanf("%c",&ch1);
            if(ch1=='#')
            {
                 u[j]=min(i,u[j]);    l[i]=min(j,l[i]);

                 d[j]=max(i,d[j]);    r[i]=max(j,r[i]);

            }
        }
    }
    while(q--)
    {
        int x,y;
        char ch;
        scanf("%d %d %c",&x,&y,&ch);
        int flag=0;
        switch(ch)
        {
              case 'U':if(x<u[y])flag=1;break;

              case 'D':if(x>d[y])flag=1;break;

              case 'L':if(y<l[x])flag=1;break;

              case 'R':if(y>r[x])flag=1;break;
        }
        if(flag)
        {
             printf("YES\n");
        }
        else
        {
             printf("NO\n");
        }
    }
    return 0;
}

二维处理:
#include<stdio.h>
const int maxn=1005;
int l[maxn][maxn];
int r[maxn][maxn];
int u[maxn][maxn];
int d[maxn][maxn];
char a[maxn][maxn];
int main()
{
     int n,m,q;
     scanf("%d%d%d",&n,&m,&q);
          for(int i=0;i<n;i++)
          {
              scanf("%s",a[i]);
          }

          for(int j=0,f=1;j<m;j++,f=1)
          {
              for(int i=0;i<n;i++)
              {
                  if(a[i][j]=='#')f=0;
                  if(f)u[i][j]=1;
              }
          }

          for(int j=0,f=1;j<m;j++,f=1)
          {
              for(int i=n-1;i>=0;i--)
              {
                  if(a[i][j]=='#')f=0;
                  if(f)d[i][j]=1;
              }
          }
          for(int i=0,f=1;i<n;i++,f=1)
          {
              for(int j=0;j<m;j++)
              {
                  if(a[i][j]=='#')f=0;
                  if(f)l[i][j]=1;
              }
          }
          for(int i=0,f=1;i<n;i++,f=1)
          {
              for(int j=m-1;j>=0;j--)
              {
                  if(a[i][j]=='#')f=0;
                  if(f)r[i][j]=1;
              }
          }
          while(q--)
          {
              int x,y;
              char ch;
              int flag=1;
              scanf("%d %d %c",&x,&y,&ch);
              x--;y--;
              int i,j;
              switch(ch)
              {
                  case 'U':if(u[x][y]==0)flag=0;break;
                  case 'D':if(d[x][y]==0)flag=0;break;
                  case 'L':if(l[x][y]==0)flag=0;break;
                  case 'R':if(r[x][y]==0)flag=0;break;
              }
              if(flag)
              {
                  printf("YES\n");
              }
              else
              {
                  printf("NO\n");
              }
          }

     return 0;
}

B-好数


题目描述

我们定义“好数”:对于一个正整数,若它只有0~9中的一种数字构成,我们就称其为好数。现在给你一个正整数,请判断它是否为好数。


输入描述:

单组输入。一个正整数x(1<=  x <= 10100000)

输出描述:

若该数x是“好数”则输出“YES”。否则输出“NO”。(没有双引号)
示例1

输入

7777777777777777777777777777777777777888888888888888

输出

NO
示例2

输入

5555555555555555555555555555555555555555

输出

YES
示例3

输入

16146483543484318146436841468

输出

NO



     
     

#include<stdio.h>
#include<string.h>
int main()
{
     char str[100004];
     scanf("%s",str);
     char k=str[0];
     for(int i=1;str[i]!='\0';i++)
     {
           if(str[i]!=k)
           {
               printf("NO\n");
               return 0;
           }
     }
     printf("YES\n");
     return 0;

}


C-装进肚子


#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef struct point{
     int x,y,c;
}p;
int cmp(p a,p b)
{
     if(a.c==b.c)
           return a.x>b.x;
     return a.c>b.c;
}
int main()
{
       int n,k,i,j;
       p a[100005];
       scanf("%d%d",&n,&k);
       for(i=0;i<n;i++)
       {
              scanf("%d",&a[i].x);
       }
       for(i=0;i<n;i++)
       {
              scanf("%d",&a[i].y);
              a[i].c=a[i].x-a[i].y;
       }
       sort(a,a+n,cmp);
       ll sum=0;
       for(i=0;i<k;i++)
       {
           sum+=a[i].x;
       }
       for(i=k;i<n;i++)
       {
           sum+=a[i].y;
       }
       printf("%lld\n",sum);
       return 0;
}



D- ZZZZone爱吃糖

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct p
{
    int l,r;
}p;
int main()
{
    int n,m,a[10001],i,j;
    long long ans=0;
    p b[10001];
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
       scanf("%d%d",&b[i].l,&b[i].r);
    }
    for(i=1;i<=m;i++)
    {
        int cnt=0;
        for(j=b[i].l;j<=b[i].r;j++)
        {
             cnt+=a[j];
        }
        ans=max(ans,ans+cnt);
    }
    printf("%lld\n",ans);
    return 0;
}


E-开心的涂刷

#include<stdio.h>
typedef long long ll;
const ll mod=1000000007;
ll qpow(ll n,ll m)
{
     ll ans=1;
      n%=mod;
     while(m)
     {
          if(m&1)
            ans=(n*ans)%mod;
          n=(n*n)%mod;
          m/=2;
     }
     return ans;
}
int main()
{
     ll n,m;
    scanf("%lld%lld",&n,&m);
     printf("%lld\n",(qpow(m,n)-(qpow(m-1,n-1)*(m%mod))+mod)%mod);
     return 0;
}

F-兼职数靶

#include<stdio.h>
char str[14][14]={
{"1111111111111"},
{"1222222222221"},
{"1222222222221"},
{"1223333333221"},
{"1223333333221"},
{"1223344433221"},
{"1223344433221"},
{"1223344433221"},
{"1223333333221"},
{"1223333333221"},
{"1222222222221"},
{"1222222222221"},
{"1111111111111"},
};
int main()
{
    char a[13][13];
    int n;
    while(~scanf("%d",&n),n)
    {
        getchar();
    int ans=0;
    for(int i=0;i<13;i++)
    {
       for(int j=0;j<13;j++)
       {
          scanf("%c",&a[i][j]);
          if(a[i][j]=='#')
          {
              ans+=(str[i][j]-'0');
          }
       }
       getchar();
    }
    printf("%.2lf\n",(ans*(1.0)/n*(1.0)));
    }
    return 0;

}


G-卡牌游戏

#include<stdio.h>
int check(char *a,char *b)
{
     if(a[0]=='J')
     {
         if(b[0]=='M')
         return 1;
         else if(b[0]=='H')
         return -1;
         else
         return 0;
     }
    else if(a[0]=='M')
     {
         if(b[0]=='T')
         return 1;
         else if(b[0]=='J')
         return -1;
         else
         return 0;
     }
     else if(a[0]=='S')
     {
         if(b[0]=='H')
         return 1;
         else if(b[0]=='T')
         return -1;
         else
         return 0;
     }
     else if(a[0]=='H')
     {
         if(b[0]=='J')
         return 1;
         else if(b[0]=='S')
         return -1;
         else
         return 0;
     }
     else if(a[0]=='T')
     {
         if(b[0]=='S')
         return 1;
         else if(b[0]=='M')
         return -1;
         else
         return 0;
     }
     return 0;
}
int main()
{
      int n;
      scanf("%d",&n);
      getchar();
      int ans1=0,ans2=0;
      while(n--)
      {
           char a[10],b[10];
           scanf("%s%s",a,b);
           getchar();
           if(check(a,b)==1)
           {
               ans1+=3;
           }
           else if(check(a,b)==-1)
           {
               ans2+=3;
           }
           else if(check(a,b)==0)
           {
               ans1++;ans2++;
           }
      }
      if(ans1>ans2)
      {
          printf("Alice\n");
      }
      else if(ans1<ans2)
      {
          printf("Bob\n");
      }
      else
      {
         printf("Draw\n");
      }
      return 0;
}



H-Hungry!

#include<stdio.h>
int main()
{
     int n;
     while(~scanf("%d",&n))
     {
           for(int i=0;i<n;i++)
           {
               printf(i==n-1?"gu...\n":"gu...");
           }
           printf("The story is so boring. And I am so hungry!\n");
     }
     return 0;
}


I-快饿死了XzzF

#include<stdio.h>
int main()
{
    int a[21]={0,2,3};
    for(int i=3;i<=20;i++)
    {
         a[i]=a[i-1]+a[i-2];
    }
    int n;
    scanf("%d",&n);
    printf("%d\n",a[n]);
    return 0;
}

J-小猪佩琪练打字

#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
int main()
{
      map<char,char> my;
     for(int i=0;i<26;i++)
     {
         my['a'+i]='a'+i;
     }
      char str[100002];
      scanf("%s",str);

      int m;
      scanf("%d",&m);
      getchar();

      for(int i=0;i<m;i++)
      {
           char ch1,ch2,c;
           scanf("%c %c",&ch1,&ch2);
           getchar();
           c=my[ch1];
           my[ch1]=my[ch2];
           my[ch2]=c;
      }
      for(int i=0;i<strlen(str);i++)
      {
           printf("%c",my[str[i]]);
      }
      printf("\n");
      return 0;


}



K-免费WIFI

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct p{
     int si,fi;
}p;
int cmp(p x,p y)
{
    if(x.si==y.si)
        return x.fi<y.fi;
    return x.si<y.si;
}
int main()
{
     int n,m;
     p a[1001];
     scanf("%d%d",&n,&m);
     for(int i=0;i<n;i++)
     {
          scanf("%d%d",&a[i].si,&a[i].fi);
     }
     sort(a,a+n,cmp);
     int ans=1,cnt;
     for(int i=0;i<n;i++)
     {
           cnt=1;
           for(int j=i-1;j>=0;j--)
           {
               if(a[i].si<a[j].fi)
               		cnt++;
           }
           ans=max(cnt,ans);
     }
     for(int i=0;;i++)
     {
          if(i*m>ans)
          {
             printf("%d\n",i);
             break;
          }
     }
     return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值