示例代碼
首先分析題目,該題是一個棧的題目,每次入棧時如果入棧的數是要大於所有當前棧中的元素次數纔可以入棧,如果不是最大的當前棧最大的那個數入棧。之後的操作是由題目給的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