Uva 12720

来源:互联网 发布:宋慧乔整容了吗 知乎 编辑:程序博客网 时间:2024/06/08 04:53

模拟题:给出一个二进制的串a,依次从a取出中间的数放到另一个串s中,当a位数是偶数时,即中间有两位时,取二者中较大的的放入s中,反复操作。最后输出s所代表的十进制数。

值得注意的地方在于最后res的求法,不要超范围。之前wa了好多次。

方法一:用两个栈模拟:

#include<stdio.h>#include<stack>#include<string.h>using namespace std;#define N 100007char s[N],str[N];int main(){    int t;    scanf("%d",&t);    int _case=1;    while(t--)    {        stack<char>a;        stack<char>b;        memset(str,0,sizeof(str));        memset(s,0,sizeof(s));        scanf("%s",s);        int len = strlen(s);        for(int i=0;i<=(len-1)/2;i++)        {            a.push(s[i]);        }        for(int i=len-1;i>(len-1)/2;i--)        {            b.push(s[i]);        }//        printf("%d %d\n",a.size(),b.size());        int count =0;        while(1)        {   if(len==0) break;            if(len%2){                if(a.size()>=b.size()){                    str[count++]=a.top();                    a.pop();                }                else {                str[count++]=b.top();                    b.pop();                }            }            else            {                if(a.top()>b.top()){                 str[count++]=a.top();                    a.pop();                }                else {                str[count++]=b.top();                    b.pop();                    }            }            len--;        }//        printf("%s\n",str);        int num =0,_count=0;        int _len = strlen(str);        long long ret = 0;        for(int i = 0; i < _len; i++){            ret *= 2;            ret += str[i] - '0';            ret %= 1000000007;        }        printf("Case #%d: %d\n", _case++, ret);    }    return 0;}


方法二:

用r,l标记模拟:

#include<cstdio>#include<string.h>#include<iostream>#include<math.h>#include<algorithm>#include<map>#include<queue>#include<stack>#include<vector>using namespace std;#define N 100007#define mod 1000000007char s[N],str[N];int main(){//freopen("data.txt","r",stdin);//freopen("out.txt","w",stdout);    int t,l,r,ccount,_case=1;    scanf("%d",&t);    while(t--)    {        memset(str,0,sizeof(str));        ccount=0;        scanf("%s",s);        int len =strlen(s);        if(len%2) {str[ccount++]=s[(len-1)/2];        r=(len-1)/2+1; l=(len-1)/2-1;        }        else {        l = (len-1)/2; r = (len-1)/2+1;        }        int times =len/2;        for(int time=0;time<times;time++)        {            if(s[l]>s[r]){                str[ccount++]=s[l];                l--;                str[ccount++]=s[r];                r++;            }            else {                str[ccount++]=s[r];                r++;                str[ccount++]=s[l];                l--;            }//           printf("%s\n",str);        }//        cout<<str<<endl;        long long num =0,_count=0;        int _len = strlen(str);       long long ret = 0;        for(int i = 0; i < _len; i++){            ret *= 2;            ret += str[i] - '0';            ret %= 1000000007;        }        printf("Case #%d: %d\n", _case++, ret);    }    return 0;}


 

 

 

0 0