排位赛题解

1 小A的烦恼

思路

十进制转二进制,右移(>>)、与(&)运算结合,遍历每个数字在二进制下点每一位。

代码

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a[4],num[4]={0};
        for(int i=0;i<4;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0;i<4;i++)
        {
            while(a[i])
            {
                if(a[i]&1) //判断末位是否为1
                {
                    num[i]++;
                }
                a[i]>>=1; //右移除2
            }
        }
        printf("%d %d %d %d\n",num[0],num[1],num[2],num[3]);
    }
    return 0;
}

题目链接

1 比赛

思路

水题!!根据问题,列出方程,解出小A与小S相遇的时间,宠物狗的速度与时间的乘积即时小狗跑的路程。

代码

#include<stdio.h>
int main()
{
    int n,m,x,y,z;
    double s;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d",&m,&x,&y,&z);
        s=1.0*z*x*m/(y-x);
        printf("%.2lf\n",s);
    }
    return 0;
}

题目链接

3 Lucky Word

思路

数组标记,素数判断,注意细节,0,1不是素数,特殊处理

代码

#include<stdio.h>
#include<math.h>
#include<string.h>
int s[26];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char ss[100];
        memset(s,0,sizeof(s));
        scanf("%s",ss);
        for(int i=0;i<strlen(ss);i++)
        {
            s[ss[i]-'a']++;
        }
        int maxn=s[0],min=s[0];
        for(int i=0;i<26;i++)
        {
            if(s[i]==0)
                continue;
            if(maxn<s[i]) maxn=s[i];
            if(minn>s[i]) minn=s[i];
        }
        int c=maxn-minn,flag=1;
        if(c==0||c==1) //0,1特殊处理
        {
            printf("No Answer\n0\n");
            continue;
        }
        for(int i=2;i<=sqrt(c);i++) //是否是素数
        {
            if(c%i==0)
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
        {
            printf("Lucky Word\n%d\n",c);
        }
        else
        {
            printf("No Answer\n0\n");
        }
    }
    return 0;
}

题目链接

4 水池数目

思路

连通问题,深度优先搜索,记下深搜点次数,就是水池的数目。每次搜过的点是1的改为0.

代码

#include<iostream>
using namespace std;
int mp[100][100];
int m,n;
void dfs(int x,int y)
{
    
    if(x>=0&&x<m&&y>=0&&y<n&&mp[x][y]==1) //判断是否越界
    {
        mp[x][y]=0;
        dfs(x-1,y); //上下左右四个方向搜索
        dfs(x,y-1);
        dfs(x+1,y);
        dfs(x,y+1);
    }
    return;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>mp[i][j];
            }
        }
        int count=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(!mp[i][j]) continue;
                count++;  //每深搜一次,加一
                dfs(i,j);
            }
        }
        cout<<count<<endl;
    }
    return 0;
}

题目链接

5 Catch My Pet

思路

1.如果小A在宠物狗前面,那么他只有一步步往后移动到奶牛位置了,即N>=K时,输出N-K即可。
2.否则用bfs+队列。遍历每一步的状态,并加在队列里,每次取队首元素搜索,直到达到目标状态,结束搜索。

代码

#include<iostream>
#include<queue>
using namespace std;
struct Step
{
    int x; //记录当前位置
    int times; //记录时间
    Step(int xx,int ss):x(xx),times(ss){}
};
queue<Step> q;
const int MAXN=100000;
int visited[MAXN]; //标记已走过的点
void bfs(int n,int k)
{
    q.push(Step(n,0));
    visited[n]=1; //走过的点标记为1
    while(!q.empty()) //判断队列是否空
    {
        Step s=q.front(); //取队首元素
        if(s.x==k) //目标状态
        {
            cout<<s.times<<endl;
            return ;
        }
        else
        {
        	  //三种移动状态,符合条件加入队列中
            if(s.x-1>=0&&!visited[s.x-1]) 
            {
                q.push(Step(s.x-1,s.times+1));
                visited[s.x-1]=1;
            }
            if(s.x+1>=0&&!visited[s.x+1])
            {
                q.push(Step(s.x+1,s.times+1));
                visited[s.x+1]=1;
            }
            if(s.x*2>=0&&!visited[s.x*2])
            {
                q.push(Step(s.x*2,s.times+1));
                visited[s.x*2]=1;
            }
            q.pop();
        }
    }
}
int main()
{
    int n,k;
    cin>>n>>k;
    bfs(n,k);
    return 0;
}

题目链接

猜你喜欢

转载自blog.csdn.net/qq_41822647/article/details/83241831
今日推荐