A - Johnny and Ancient Computer
水题
#include <iostream>
using namespace std;
int main(){
long long int a,b,num,N,c;
cin>>N;
while(N--){
cin>>a>>b;
if(a<b) swap(a,b);//只要是非0都会当做true
num=0;
if(a%b) cout<<"-1"<<endl;
else{
c=a/b;
while(c%8==0){
c/=8;
num++;
}
while(c%4==0){
c/=4;
num++;
}
while(c%2==0){
c/=2;
num++;
}
if(c!=1)
cout<<"-1"<<endl;
else cout<<num<<endl;
}
}
return 0;
}
B - Garland
待补题
C - 哈密顿绕行世界问题
bfs算法+回溯
bfs算法 https://blog.csdn.net/weixin_40953222/article/details/80544928
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
//dfs算法
bool map[21][21];//用于储存地图
bool point[21];//统计到过的点
int pos[21];//存储依次经过的点,用于输出;
int m;//起点
int num;//统计经过节点个数
int t;//解的个数
//检查是否构成回路,即最后一个位置与终点相连
int check(int m){
if(map[pos[num]][m]==0){
return 0;
}
return 1;
}
void dfs(int step){//输入初始点
if(num>=20){//如果已经到了20个城市了,题目要求是各个城市只走一遍
if(check(m)){//检查是否构成回路
printf("%d: %d",++t,m);//输出初始点
for(int i=2;i<=num;i++){
printf(" %d",pos[i]);//从记录的第二个点开始输出
}
printf(" %d\n",m);//最后回归
}
return;//结束程序
}
for(int i=1;i<=20;i++){//寻找可走路线
if(map[step][i]&&!point[i]){//step是顶点,map记录的是关系,意思是首先要有关系,第二是没到过的点
num++;//如果找到了这样的点,计数
pos[num]=i;//标记
point[i]=true;//防止重复走
dfs(i);//继续走,递归,当一种可能性结束以后再来一种,完美解决字典序问题
point[i]=!true;//回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
num--;
}
}
}
int main(){
memset(map,0,sizeof(map));
for(int i=1;i<=20;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
//表示每个顶点之间的关系,构成网
map[i][x] = true;
map[x][i] = true;
map[i][y] = true;
map[y][i] = true;
map[i][z] = true;
map[z][i] = true;
}
while(true){
scanf("%d",&m);
if(m==0) break;
else {
t=0;
num=1;
memset(point,0,sizeof(point));
point[m]=true;//初始点到了true
dfs(m);
//pos[1]=m;
}
}
return 0;
}
D - 敌兵布阵
线段树
这题我原代码一直超时,看看能不能在我原代码的基础上修改,不能,就是超时,老实点线段树吧
待补题,线段树再放放
代码在这里了,但是还是看不懂他这个建树
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=50005;
int n,tree[maxn*4],m,tag[maxn*4],a[maxn],t,c1,c2,num;
char cmd[15];
void pushup(int x,int l,int r)
{
tree[x]=tree[x<<1]+tree[x<<1|1];//x<<1=2*x;
}
void build(int x,int l,int r)//建树
{
if(l==r)
{
tree[x]=a[l];
return ;
}
int mid=(l+r)>>1;//(l+r)/2取整
build(x<<1,l,mid);//
build(x<<1|1,mid+1,r);
pushup(x,l,r);
}
void inserts(int x,int l,int r,int pos,int k)
{
if(l>pos||r<pos)
return;
if(l==r&&l==pos)
{
tree[x]+=k;
return ;
}
int mid=(l+r)>>1;
inserts(x<<1,l,mid,pos,k);
inserts(x<<1|1,mid+1,r,pos,k);
pushup(x,l,r);
}
int query(int x,int l,int r,int kl,int kr)
{
int ans=0;
if(l>kr||r<kl)
return ans;
if(l>=kl&&r<=kr)
{
return tree[x];
}
int mid=(l+r)>>1;
ans+=query(x<<1,l,mid,kl,kr);
ans+=query(x<<1|1,mid+1,r,kl,kr);
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
num++;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
getchar();
printf("Case %d:\n",num);
build(1,1,n);
while(scanf("%s",cmd)&&cmd[0]!='E')
{
scanf("%d%d",&c1,&c2);
if(cmd[0]=='Q')
{
cout<<query(1,1,n,c1,c2)<<endl;
}
if(cmd[0]=='A')
inserts(1,1,n,c1,c2);
if(cmd[0]=='S')
inserts(1,1,n,c1,-c2);
}
}
return 0;
}
E - Dungeon Master
没看懂这题目什么意思就离谱