Problem A

https://codeforces.com/contest/1362/problem/A

判断x/y是不是2的k次方, 如果是

k/3 + (k%3)/2 + (k%3%2)即为答案

#include<bits/stdc++.h>
using namespace std;
#define ll long long ll log2(ll a) {
ll count = 0;
while (1) {
if (a >>= 1)
count++;
else
break;
}
return count;
} int main(){
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int t;cin>>t;
ll x,y;
ll ans,tmp;
while(t--){
cin>>x>>y;
if(x<y)swap(x,y);
if(x==y)cout<<"0"<<endl;
else{
if(x%y!=0||(x%y==0&&(x/y&(x/y-1))!=0))cout<<"-1"<<endl;
else{
tmp = log2(x/y);
ans = tmp/3 + (tmp%3)/2 + (tmp%3%2);
cout<<ans<<endl;
}
}
}
return 0;
}

Problem B

https://codeforces.com/contest/1362/problem/B

一开始以为模拟过不了, 结果直接暴力模拟就好了...

#include<bits/stdc++.h>
using namespace std; int main(){
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
set<int> S;
int t;cin>>t;
while(t--){
int n,s,tmp=0,max=-1,flag=1;
cin>>n;
while(n--)
{
cin>>s;
if(s>max)
max=s;
S.insert(s);
}
for(int i=1;i<=1024;++i){
flag = 1;
for(set<int>::iterator it = S.begin(); it!= S.end(); it++)
{
tmp = i^*it;
if(!S.count(tmp)){
flag=0;
}
}
if(flag==1){
cout<<i<<endl;
break;
}
}
if(flag==0)cout<<"-1"<<endl;
S.clear();
}
return 0;
}

Problem C

https://codeforces.com/contest/1362/problem/C

这题我是打表找规律找出来的

首先可以发现像1,10,100,1000,10000这样的数, 假设最高位为第k位

他们的答案应该是\(2^k-1\) , 又由于一个数可以表示成很多个这样的数相加

比如:

110010 = 100000 + 10000 + 10

那么只需要把第k位为1的各项依次取\(2^k-1\)然后累加即可得到最后的结果

#include<bits/stdc++.h>
using namespace std;
#define ll long long int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
ll sum=0,cnt=1,tmp=0;
while(t--){
ll n;cin>>n;
while(1)
{
tmp = n&1;
n = n>>1;
if(tmp==1)
sum+=pow(2,cnt)-1;
if(n==0)break;
cnt++;
}
cout<<sum<<endl;
cnt=0;sum=0;
}
return 0;
}

另外一种解法:

for example: input = 5(101)

先来看一组数 :

000

001

010

011

100

可以看到, 第一位每次都变, 第二位每2次变一次, 第三位每4次变一次, 即第k位每\(2^{k+1}\)改变一次, 对于一个十进制数n, 只需要累加\(n/2^{k-1}\)(k表示第k位)即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
while(t--){
ll ans=0,tmp=0,bi=1;
ll n;cin>>n;tmp=n;
while(n)
{
ans+=tmp/bi;
bi<<=1;
n>>=1;
}
cout<<ans<<endl;
}
return 0;
}

Codeforces Round #647 (Div. 2)的更多相关文章

  1. Codeforces Round #647 (Div. 2) D. Johnny and Contribution(BFS)

    题目链接:https://codeforces.com/contest/1362/problem/D 题意 有一个 $n$ 点 $m$ 边的图,每个结点有一个从 $1 \sim n$ 的指定数字,每个 ...

  2. Codeforces Round #647 (Div. 2) C. Johnny and Another Rating Drop(数学)

    题目链接:https://codeforces.com/contest/1362/problem/C 题意 计算从 $0$ 到 $n$ 相邻的数二进制下共有多少位不同,考虑二进制下的前导 $0$ .( ...

  3. Codeforces Round #647 (Div. 2) B. Johnny and His Hobbies(枚举)

    题目链接:https://codeforces.com/contest/1362/problem/B 题意 有一个大小及元素值均不超过 $1024$ 的正整数集合,求最小正整数 $k$,使得集合中的每 ...

  4. Codeforces Round #647 (Div. 2) A. Johnny and Ancient Computer

    题目链接:https://codeforces.com/contest/1362/problem/A 题意 有一个正整数 $a$,可选择的操作如下: $a \times 2$ $a \times 4$ ...

  5. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! A、Johnny and Ancient Computer B、Johnny and His Hobbies C、Johnny and Another Rating Drop

    题目链接:A.Johnny and Ancient Computer 题意: 给你两个数a,b.问你可不可以通过左移位运算或者右移位运算使得它们两个相等.可以的话输出操作次数,不可以输出-1 一次操作 ...

  6. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! D. Johnny and Contribution (贪心,模拟)

    题意:有\(n\)个点,\(m\)条边,现在要给这些点赋值,,每次只能赋给某一点的四周(所连边)的最小没出现过的值.如果不能按照所给的数赋值,输出\(-1\),否则输出赋值顺序. 题解:我们用\(pa ...

  7. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! C. Johnny and Another Rating Drop (规律,二进制)

    题意:有一个正整数\(n\),要求写出所有\(1\)~\(n\)的二进制数,统计相邻的两个二进制同位置上不同数的个数. 题解:打表找规律,不难发现: ​ \(00000\) ​ \(00001\) ​ ...

  8. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  9. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

随机推荐

  1. Hyperledger Fabric——balance transfer(四)安装和实例化chaincode

    详细解析blance transfer示例的安装(install)和实例化(Instantiate)链码(chaincode)的过程.安装chaincode会根据本地的链码文件生成chaincode镜 ...

  2. Pyqt5_QtextEdit

    QtextEdit QTextEdit类是一个多行文本框控件,可以显示多行文本内容,当文本内容超出控件显示范围时,可以显示水平个垂直滚动条,Qtextedit不仅可以用来显示文本还可以用来显示HTML ...

  3. nodejs链接mysql 中的问题

    首先你得对mysql ,有个大概的认识. 比如说:如何安装,使用基本的语法,测试安装是否能成功,以及成功之后简单的对于数据库的,操作(增删改查)... 下面是业务场景:在爬虫过程中,租后需要将信息输出 ...

  4. Golang源码学习:调度逻辑(四)系统调用

    Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...

  5. 前端基础进阶(十四):es6常用基础合集

    在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高兴的是,如果你熟悉 ...

  6. 9.快照持久化和AOF持久化

    持久化功能redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会把硬盘中的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化”效果. re ...

  7. SourceTree 配置 GitLab

    生成SSH 创建SSH,执行ssh-keygen -t rsa -C "youremail@example.com",会在.ssh目录下生成id_rsa.id_rsa.pub两个私 ...

  8. Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案

    excel中新增行列时报错: 提示:在当前工作表的最后一行或列中,存在非空单元格,所以无法插入新行或新列.

  9. JVM系列.JVM内存模型

    <Java虚拟机规范>将虚拟机的内存分为以下几个区域: 堆区:堆区是JVM中最大的一块内存区域,按照垃圾分代收集的角度划分,又可以分成年轻代和老年代,而年轻代内存又被分成三部分,Eden空 ...

  10. leetcode56之合并区间

    题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例: 输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1, ...