排位賽題解
阿新 • • 發佈:2018-11-30
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;
}