【ACM算法】Maximum Element In A Stack

示例代码

首先分析题目,该题是一个栈的题目,每次入栈时如果入栈的数是要大于所有当前栈中的元素次数才可以入栈,如果不是最大的当前栈最大的那个数入栈。之后的操作是由题目给的rng61算法来生成,最后要求输出的数是每一次的 操作数(也就是第几次push或者pop操作)*栈顶数 每一次的操作算出来的数取异或和。


#include <cstdio>
#include <stack>

using namespace std;
int n, p, q, m;
unsigned int SA, SB, SC;
unsigned int rng61(){
	SA ^= SA << 16;
	SA ^= SA >> 5;
	SA ^= SA << 1;
	unsigned int t = SA;
	SA = SB;
	SB = SC;
	SC ^= t ^ SA;
	return SC;
}
void PUSH(int v, stack <int> &s) {//这里传的是一个引用
	if(s.empty())

		s.push(v);
	else
		s.push(max(v, s.top()));
}
void POP(stack <int> &s) {
	if(s.empty())
		return ;
	else
		s.pop();
	return ;
}

int main() {
	int T;
	scanf("%d", &T);
	int num = 1;
	while(T--) {
		stack <int> s;
		long long sum = 0;
		scanf("%d%d%d%d%u%u%u", &n, &p, &q, &m, &SA, &SB, &SC);
		for(int i = 1; i <= n; i++){
			if(rng61() % (p + q) < p)
				PUSH(rng61() % m + 1, s);
			else
				POP(s);
			if(s.empty())
                sum^=i*0;
            else
                sum^=i*s.top();
		}
		printf("Case #%d: %lld\n", num++, sum); //long long 型的标准输出
	}
}

用到的知识点c++的stack库

由于考虑结果的值的大小

当数据精度要求不超过15位有效数字时,可以使用double;

当数据精度要求不超过19位有效数字时,可以使用long double;i

nt: 4byte =  32 bit 有符号signed范围:2^31-1 ~ -2^31即:2147483647 ~ -2147483648无符号unsigned范围:2^32-1 ~ 0即:4294967295 ~ 0

long: 4 byte = 32 bit 同int型

double: 8 byte = 64 bit 范围:1.79769e+308 ~ 2.22507e-308

long double: 12 byte = 96 bit 范围: 1.18973e+4932 ~ 3.3621e-4932

float: 4 byte = 32 bit 范围: 3.40282e+038 ~ 1.17549e-038

long long的最大值:9223372036854775807(>10^18)
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

猜你喜欢

转载自blog.csdn.net/qq_37406764/article/details/81121206