A BowWow and the Timetable
按照案例是把二进制转换为十进制, 让后计算 4^k 小于这个十进制, 那么 k 的值就是答案, 但是二进制的长度达到了 100 位, 也就意味这最大值可以是 2^99, 但是如果用十进制的话, 存不了那么大的数据, 所以要用二进制转换为四进制
然后判断一些特殊值
比如 010, 奇数位的, 补 0
比如转换为四进制后为 1000 的, 答案是 3 而不是 4, 因为该值刚好是 4 的幂方
再者, 在补 0 时需要反向存储二进制
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #define ll long long
- using namespace std;
- int main(){
- char a[105];
- char s[105];
- char c[105];
- int cnt=0;
- scanf("%s",a+1);
- int len=strlen(a+1);
- for(int i=1;i<=len;i++){
- s[i]=a[len+1-i];
- }
- if(len%2!=0){
- s[len+1]='0';
- len++;
- }
- for(int i=1;i<=len;i+=2){
- if(s[i]=='0'&&s[i+1]=='0'){
- c[cnt++]='0';
- }else if(s[i]=='1'&&s[i+1]=='0'){
- c[cnt++]='1';
- }else if(s[i]=='0'&&s[i+1]=='1'){
- c[cnt++]='2';
- }else if(s[i]=='1'&&s[i+1]=='1'){
- c[cnt++]='3';
- }
- }
- int allone=0;
- for(int i=0;i<cnt;i++){
- if(c[i]>='1'){
- allone++;
- }
- }
- for(int i=0;i<cnt;i++){
- int sum=0;//1 的个数
- for(int j=i;j<cnt;j++){
- if(c[j]>='1')sum++;
- }
- if(sum==0){
- cnt=i;
- break;
- }
- }
- if(allone==1&&c[cnt-1]=='1'){
- cnt--;
- }else if(c[cnt-1]=='0'){
- cnt--;
- }
- printf("%d\n",cnt);
- return 0;
- }
- B Mislove Has Lost an Array
找规律
首先有两个值, 最短与最长
- #include <iostream>
- #include <cstdio>
- using namespace std;
- int main(){
- int n,l,r;
- scanf("%d%d%d",&n,&l,&r);
- int minn=1;
- for(int i=1;i<=l;i++){
- minn*=2;
- }
- minn=minn-1+n-l;
- printf("%d",minn);
- int maxx=1;
- for(int i=1;i<=r;i++){
- maxx*=2;
- }
- maxx--;
- int x=1;
- for(int i=1;i<r;i++){
- x*=2;
- }
- maxx+=x*(n-r);
- printf("%d\n",maxx);
- return 0;
- }
- // 4 3
- // 1 2 4 4
- // 5 3
- // 1 2 4 4 4
- // 4 2
- // 1 2 2
来源: http://www.bubuko.com/infodetail-3166241.html