1. 程式人生 > >排位賽題解

排位賽題解

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;
}

題目連結