一道题
  • 板块灌水区
  • 楼主_ldr_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/4/8 12:57
  • 上次更新2023/10/23 19:05:32
查看原帖
一道题
716590
_ldr_楼主2023/4/8 12:57

3.栈序列(stack.cpp)

【问题描述】

给出两个序列 入栈 和 出栈 ,栈内元素取值从 1 到 n。现在我们给出 q 次询问,对于每 个询问:包含入栈和出栈两个序列。已知入栈序列是 pushed,如果出栈序列有可能是 popedd 则输出 1,否则输出 0,并将每个询问的答案 依次从左到右排列,把得到的串视为一个二进制 数,(注意,这个数可能很大)输出这个二进制数 mod 100007 的值。

【输入格式】输入文件名为 stack.in。

第一行一个整数 q,询问次数。

接下来 q 个询问,对于每个询问:

第一行一个整数 n 表示序列长度;

第二行 n 个整数表示入栈序列 pushed;

第二行 n 个整数表示出栈序列 poped;

【输出格式】输出文件名为 stack.out。

一个整数,为按要求输出的答案。

【输入输出样例 1 】

stack.in

2

5

1 2 3 4 5

5 4 3 2 1

4

1 2 3 4

2 4 1 3

stack.out

2

【样例说明】

第一次询问得到 1,第二次询问得到 0,按从左到右的顺序排列为 10,对应的二进制数为 2。

【输入输出样例 2 】

stack.in

4

5

3

1 3 2

2 1 3

4

4 1 2 3

2 4 1 3

2

2 1

1 2

5

5 1 2 4 3

1 2 5 3 4

3

3 1 2

3 1 2

stack.out

7

【数据说明】

对于 100% 的数据,1<=q<=1000,1<=n<=9;

#include<bits/stdc++.h>
using namespace std;
string s;
int binTo(string str){
    int len=str.length();
	int n=0;
	for(int i=1;i<=len;++i)
	{
		if(str[i]=='1')
			n+=pow(2,len-1-i);
	}
	return n;
}
int main(){
	int q;
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		int n;
		int a[100001],b[100001];
		stack<int>st;
		cin>>n;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		for(int i=1;i<=n;i++)
		cin>>b[i];
		int head=1;
		for(int i=1;i<=n;i++)
		{
			st.push(a[i]);
			while(st.top()==b[head])
			{
				st.pop();
				head++;
				if(st.empty())
				break;
			}
		}
		if(st.empty()){
			s[i]='1';
		}
		
		else {
			s[i]='0';
		}
	}
	cout<<binTo(s);
}

大佬查查错,样例1输出0

2023/4/8 12:57
加载中...