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