题解 P2114 【[NOI2014]起床困难综合症】
看见别的大佬的代码我都自卑了
于是我来写一篇我看得懂的emmm
大概思路呢是:
模拟bàolì
int Ans[i][2];//用这玩意儿来存最后攻击力(二进制下)第i为是0还是1
So 这个需要初始化:
Max = log2(M);
for (int i = 0; i <= Max; ++i)Ans[i][1] = 1;//i的最大值是log2(M)
然后暴力(只会暴力emmmmm):
#define Work(X) for (int i(0); i < 31; ++i)\
{ \
Ans[i][0] = Ans[i][0] X T%2,\
Ans[i][1] = Ans[i][1] X T%2;\
if (T)T >>= 1; \
}
//万恶的宏,确实是挺好用的
...
for (int i(0); i < N; ++i)
{
scanf("%s %d", Opt, &T);
if (Opt[0] == 'A')Work(&)
else if(Opt[0] == 'O')Work(|)
else if(Opt[0] == 'X')Work(^)
}
CodeTime
#include <stdio.h>
#include <math.h>
#define Work(X) for (int i(0); i < 31; ++i)\
{ \
Ans[i][0] = Ans[i][0] X T%2,\
Ans[i][1] = Ans[i][1] X T%2;\
if (T)T >>= 1; \
}
int N, M, T, Max, Temp(1), Sum;
int Ans[35][2];
char Opt[10];
int main()
{
scanf("%d %d", &N, &M);
Max = log2(M);
for (int i = 0; i <= Max; ++i)Ans[i][1] = 1;
for (int i(0); i < N; ++i)
{
scanf("%s %d", Opt, &T);
if (Opt[0] == 'A')Work(&)
else if(Opt[0] == 'O')Work(|)
else if(Opt[0] == 'X')Work(^)
}
for (int i = 0; i < 31; ++i, Temp <<= 1)
if (Ans[i][1] || Ans[i][0])Sum += Temp;//如果最后是1,不管是谁都加了
//这还能通过Ans数组找到最开始的那些数字呢
printf("%d\n", Sum);
}