啊啊,helloworld的题。。我非要这么写-.-
zj(兴高采烈):我半个小时A了六个题哦!很简单的,你肯定也可以一个小时之内&*....
我:.....
https://cn.vjudge.net/problem/UVA-11636
#include<iostream>
#include<algorithm>
using namespace std;
int a[14]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,100010};
int n;
int main(){
int kase=1;
while(cin>>n){
if(n<=0)break;
else if(n==1)printf("Case %d: 0\n",kase++);
else{
int pos = lower_bound( a, a + 14, n) - a;
pos=pos+1;
printf("Case %d: %d\n",kase++,pos);
//cout<<pos+1<<endl;
}
}
return 0;}
稍微注意一下有负数情况,然后n=0不行要小鱼等于才可以。
学一下lower_bound用法,就是很快的(通过二分)二分里面找到了它 的位置
插入的数字是m,一共有n个数字
biubiu比如1234445,那么你插入的left就是
left = upper_bound(a,a+n,m)-a;
//按从小到大,m最多能插入数组a的哪个位置
right = lower_bound(a,a+n,m)-a;
//按从小到大,m最少能插入数组a的哪个位置
也就是哦,a[5]里面,n=5,m=2,要插入2
最多 就是upper pos就是3 a[3]
(其实已经是第四个位置了,但是下标是3..)
最少 就是lower pos就是2 a[2]
(其实也是第三个了...但是下标是a[2])
然后这个题里面是2的n次方嘛..
int pos = lower_bound( a, a + 14, n) - a;
然后就是n插入的话,最少的那个次方咯
比如n=5,那么只能插入在4后面,2,4,5它就是2,a[2] 2^2=4
再比如n=3,那么只能在2后面,它是第二个,也就是a[1],2^1=2
再比如n=4,因为是lower_bound所以和3一样,……也是1,然后pos+1(因为这个题的特殊性……)
……?竟然4是1然后加……
小问题..改成upper就可以了,这个时候4是2 3是1 5是2 (但是这个题会出错,因为题目的意思是 复制完了之后可以再复制好多遍云云)
参考:https://www.cnblogs.com/ljhacm/p/6904414.html
printf的用法……(这种情况之下都显然是printf更方便)
printf不用加&,pos++多方便啊
printf("Case %d: %d\n", kase++, pos+1);
对scanf来说他要把东西送到人家家里去,所以需要获取人家的地址
(先让我笑一会……)
reverse:
参考https://blog.csdn.net/u012877472/article/details/49557077
头文件是algorithm 用于翻转...
- string b;
- reverse(a.begin() ,a.end());
- cout<<a<<endl;
substr:提取从 哪里到哪里
temp = a.substr(i, len2);
与:两位同时为“1”,结果才为“1”,否则为0
参照(^运算,全真才真,一假则假)
(但是其实符号是&呀)
或:参加运算的两个对象只要有一个为1,其值为1。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
(参照或| ,全假才假,一真就真)(更加宽容hhhh)
哇!异或
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
【异吗?如果是一样的,0和0,就不异,是假的(0,考了0分)】
【异吗?如果是不一样的,1和0,是异的,是真的(1,true,考了一百)】
移动
左移运算符(<<)
相当于是2的i次方 从i=1开始 2的1 ,2,3,。。。次方
1 << i
参考https://blog.csdn.net/21aspnet/article/details/7387373。。。一定要记住哇~