2018年长沙理工大学第十三届程序设计竞赛 ABCDEGHL

A

https://www.nowcoder.com/acm/contest/96/A

检测输入字符串是否是”lovelive“ (出题人是拉拉银)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    char s[110];
    while(gets(s))
    {
        int len=strlen(s);
        if(len!=8)
        {
            cout<<"no"<<endl;
            continue;
        }
        int cmp=0;
        if(s[0]=='l'||s[0]=='L')
            cmp++;
        if(s[1]=='o'||s[1]=='O')
            cmp++;
        if(s[2]=='v'||s[2]=='V')
            cmp++;
        if(s[3]=='e'||s[3]=='E')
            cmp++;
        if(s[4]=='l'||s[4]=='L')
            cmp++;
        if(s[5]=='i'||s[5]=='I')
            cmp++;
        if(s[6]=='v'||s[6]=='V')
            cmp++;
        if(s[7]=='e'||s[7]=='E')
            cmp++;
        if(cmp==8)
        {
            cout<<"yes"<<endl;
        }
        else
            cout<<"no"<<endl;
    }
    return 0;   
}


B

https://www.nowcoder.com/acm/contest/96/B

2个数相加不考虑进位即  ci=(ai+bi)%10

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    char a[11];
    char b[11];
    int res[11];
    while(cin>>a>>b)
    {
        memset(res,0,sizeof(res));
        int lena=strlen(a);
        int lenb=strlen(b);
        int lenmin=min(lena,lenb);
        int lenmax=max(lena,lenb);
        for(int i=0;i<lenmin;i++)
        {
            res[i]=(a[lena-1-i]-'0')+(b[lenb-1-i]-'0');
        }
        if(lena>lenb)
        {
            for(int i=lenmin;i<lenmax;i++)
            {
                res[i]=(a[lena-1-i]-'0');
            }
        }
        if(lenb>lena)
        {
            for(int i=lenmin;i<lenmax;i++)
            {
                res[i]=(b[lenb-1-i]-'0');
            }
        }
        for(int i=0;i<lenmax;i++)
        {
            res[i]%=10;
        }
        bool cmp=0;
        for(int i=lenmax-1;i>=0;i--)
        {
            if(res[i]||cmp)
            {
                cout<<res[i];
                cmp++;
            }
        }
        if(!cmp)
            cout<<"0";
        cout<<endl;
    }
    return 0;   
}


C

https://www.nowcoder.com/acm/contest/96/C

打表发现规律就是b/(a+b)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
    int T;
    double a,b,k;
    cin>>T;
    while(T--)
    {
        cin>>a>>b>>k;
        double res=b/(a+b);
        cout<<fixed<<setprecision(3)<<res<<endl;
    }
    return 0;
}

D

https://www.nowcoder.com/acm/contest/96/D

求l-r中的数对于整除的偏序关系来组成哈斯图,求哈斯图的边数

#include<bits/stdc++.h>
using namespace std;
bool check[1111111];
int prime[1111111];
int main()
{
        memset(check, 0, sizeof(check));
        int count = 0;
        for (long long int i = 2; i <= 1000000; i++)
        {
            if (!check[i])
                prime[count++] = i;
            for (int j = 0; j < count; j++)
            {
                if (i*prime[j] >1000000)
                    break;
                check[i*prime[j]] = 1;
                if ((i%prime[j]) == 0)
                    break;
            }
        }
        int l,r;
    while(~scanf("%d%d",&l,&r))
    {
          
        //cout<<"1"<<endl;
      long long  ans=0;
 
        int zz=0;
        for(int i=r/2;i>=l;i--)
        {
            if(i*prime[zz+1]>r&&i*prime[zz]<=r)
            {
                ans+=zz+1;
            }
            else{
                while(i*prime[zz+1]<=r&&zz+1<=count-1)
                {
                    zz++;
                }
                //if(l==1)
                //cout<<zz<<endl;
                ans+=zz+1;
            }
            //int p=upper_bound(prime,prime+rrr,fid)-prime;
            //cout<<p<<endl;
        }
         
     
        printf("%lld\n",ans);
    }
    return 0;
}


E

https://www.nowcoder.com/acm/contest/96/E

最短路裸题

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=200000+10;
struct node
{
    int x,y;
};
int n,m;
vector<node>e[N];
long long dis[N];
bool vis[N];
void disk()
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++)dis[i]=inf;
    vis[1]=true;
    dis[1]=0;
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        for(int i=0;i<e[u].size();i++)
        {
            int v=e[u][i].x;
            if(dis[v]>dis[u]+e[u][i].y)
            {
                dis[v]=dis[u]+e[u][i].y;
                if(!vis[v])
                {
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
    }
    if(dis[n]==inf)
    {
        printf("qwb baka\n");
    }
    else printf("%lld\n",dis[n]);
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<=n;i++)
        {
            e[i].clear();
        }
        int u,v,w;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            node q;
            q.x=v;
            q.y=w;
            e[u].push_back(q);
            q.x=u;
            q.y=w;
            e[v].push_back(q);
        }
        disk();
    }
    return 0;
}

G

https://www.nowcoder.com/acm/contest/96/G

在起点和终点之间加了个钥匙,先找起点到所有钥匙的最短距离,再从钥匙出发找到终点的最短距离;

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=550;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,m;
struct node
{
    int x,y;
};
char mm[N][N];
int dis[N][N];
int dis1[N][N];
bool vis[N][N];
int sx,sy,ex,ey;
int xx[N*N],yy[N*N];
int k;
bool check(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m||mm[x][y]=='#')return true;
    return false;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%s",mm[i]);
        }
        k=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(mm[i][j]=='P')sx=i,sy=j;
                if(mm[i][j]=='E')ex=i,ey=j;
                if(mm[i][j]=='K')xx[k]=i,yy[k++]=j;
                dis[i][j]=dis[j][i]=inf;
                dis1[i][j]=dis1[j][i]=inf;
            }
        }
      memset(vis,false,sizeof(vis));
      vis[sx][sy]=true;
      dis[sx][sy]=0;
      node q,p;
      q.x=sx;
      q.y=sy;
      queue<node>Q;
      Q.push(q);
      while(!Q.empty())
      {
           p=Q.front();
           Q.pop();
           vis[p.x][p.y]=false;
           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;
                if(mm[q.x][q.y]=='E')continue;
                if(dis[q.x][q.y]>dis[p.x][p.y]+1)
                {
                    dis[q.x][q.y]=dis[p.x][p.y]+1;
                    if(!vis[q.x][q.y]){
                        Q.push(q);
                        vis[q.x][q.y]=true;
                         }
                     }
            }
      }
       memset(vis,false,sizeof(vis));
      vis[ex][ey]=true;
      dis1[ex][ey]=0;
       
      q.x=ex;
      q.y=ey;
      Q.push(q);
      while(!Q.empty())
      {
           p=Q.front();
           Q.pop();
           vis[p.x][p.y]=false;
           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;
                if(dis1[q.x][q.y]>dis1[p.x][p.y]+1)
                {
                    dis1[q.x][q.y]=dis1[p.x][p.y]+1;
                    if(!vis[q.x][q.y]){
                        Q.push(q);
                        vis[q.x][q.y]=true;
                         }
                     }
            }
             
      }
      int flag=0;
      int minn=inf;
      for(int i=0;i<k;i++)
      {
          if(dis[xx[i]][yy[i]]!=inf&&dis1[xx[i]][yy[i]]!=inf)
          {
            flag=1;
            minn=min(minn,dis[xx[i]][yy[i]]+dis1[xx[i]][yy[i]]);
            }
      }
      if(!flag)
      {
        cout<<"No solution"<<endl;
      }
      else cout<<minn<<endl;
}
    return 0;
}


H

https://www.nowcoder.com/acm/contest/96/H

前后处理一下前后缀和,再处理一下前后缀的最大值,都是n的效率,最后遍历每一个长度的子串,就可以用O(1)的效率找到当前子串和另一个最大子串的和最大值,扫一遍比比就可以了

#include<bits/stdc++.h>
using namespace std;
long long a[222222];
long long sq[222222];
long long sh[222222];
long long mq[222222];
long long mh[222222];
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
        }
        memset(sq,0,sizeof(sq));
        for(int i=0;i<k;i++)
        {
            sq[0]+=a[i];
        }
        for(int i=1;i<=n-k;i++)
        {
            sq[i]=sq[i-1]-a[i-1]+a[i+k-1];
        }
        memset(sh,0,sizeof(sh));
        for(int i=n-1;i>=n-k;i--)
        {
            sh[n-1]+=a[i];
        }
        for(int i=n-2;i>=k-1;i--)
        {
            sh[i]=sh[i+1]-a[i+1]+a[i-k+1];
        }
        for(int i=0;i<=n-k;i++)
        mq[i]=-999999999999;
        mq[n-k]=sq[n-k];
        for(int i=n-k-1;i>=0;i--)
        {
            mq[i]=max(sq[i],mq[i+1]);
        }
        for(int i=k-1;i<=n-1;i++)
        mh[i]=-999999999999;
        mh[k-1]=sh[k-1];
        for(int i=k;i<=n-1;i++)
        {
            mh[i]=max(sh[i],mh[i-1]);
        }
        long long ans=-999999999999;
             
        for(int i=0;i<=n-k;i++)
        {
            long long maaaa=-999999999999;
            if(i>=k)
            {
                maaaa=max(maaaa,mh[i-1]);
            }
            if(n-i-k>=k)
            {
                maaaa=max(maaaa,mq[i+k]);
            }
            //cout<<sq[i]<<" "<<maaaa<<endl;
            ans=max(ans,sq[i]+maaaa);
        }
        cout<<ans<<endl;
    }
    return 0;
}


L

https://www.nowcoder.com/acm/contest/96/L

模拟..小小的贪心

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    int p[111];
    while(t--)
    {
        int a,b,n;
        cin>>a>>b>>n;
        int sum=0;
        for(int i=0;i<n;i++)
        cin>>p[i],sum+=p[i];
        sort(p,p+n);
        int zj=n-1;
        int da=0;
        for(int i=0;i<n;i++)
        {
            da+=p[i]/2;
        }
        if(b>=da)
        {
            b-=da;
            a+=b;
            sum-=da*2;
            if(a>=sum)
            cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        else{
             
            sum-=b*2;
            if(a>=sum)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/threeh20/article/details/80103751