寒假集训学习记录 1-18
嗯,今天的收获怎么说呢,关于我们这学期期末的项目有了新进展,很开心啊。
然后进入主题,今天可能会有些草率,水群去了,难受,忘了今天的博客,废物本废了。所以今天的内容是位运算(巧的是昨天的快速幂刚好遇到,然后今天又写到了一道位运算的题),http://codeforces.com/problemset/problem/579/A,附上题目,感兴趣可以做做,感受一下AC的快乐。然后这个题的大概意思就是这样:你想要在盒子里饲养一些细菌,首先盒子是空的。然后你每天早上会放一些细菌到盒子里,每到了晚上,盒子里的每个细菌就会分裂成两个。有些时候你知道了盒子里确切的细菌数量x。要问这些天你最少得往盒子里放多少个细菌。
然后我一看这道题,最初的想法是难道是奇数就输出2,是偶数就直接输出1,本来觉得奇怪,怎么还能做到如此简单的题,然后当然本着抖机灵的心态,我还真的交上去试了试,事实证明我就是个傻子,但是傻子的直觉又很正确(无语,呜呜呜)。然后发现好像又和2的倍数有关系,这不就来了嘛。
关于2的倍数,就按照题的样例,当你需要尽早得到5个细菌的时候,第一天晚上放进去1个,第二天晚上就会得到两个细菌,第三天晚上得到4个,那么在今天晚上再放进去一个,就刚好5个了。然后需要8个的话,就直接4天,刚好能得到8个细菌。然后关键的来了,这个样例我个人觉得非常具有迷惑性,所以我们来试试当你需要88个细菌的时候,最少需要几天,88/2=44 44/2=22 22/2=11,这个时候不是二的倍数了,就需要放进去一个细菌凑成二的倍数,12/2=6 6/2=3 又加一 4/2=2 2/2=1,知道第一天晚上只需要放一个的时候,这道题就出来了,所以代码如下:
1 #include<stdio.h> 2 #include<math.h> 3 int main(){ 4 int a,sum=0; 5 scanf("%d",&a); 6 while(a){ 7 if(a&1) sum++; 8 a>>=1; 9 } 10 printf("%d",sum); 11 return 0; 12 }
其实代码可少了,思路很重要,emmmm,也可以直接求解,关于位运算,昨天的博客写了一点,很不完善,有空再写吧。
嗯,每天一句:我是小废物,加油,继续水题去了。