模拟题:给出一个二进制的串a,依次从a取出中间的数放到另一个串s中,当a位数是偶数时,即中间有两位时,取二者中较大的的放入s中,反复操作。最后输出s所代表的十进制数。
值得注意的地方在于最后res的求法,不要超范围。之前wa了好多次。
方法一:用两个栈模拟:
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
#define N 100007
char 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 1000000007
char 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;
}