D OR
思路:
a
i
+
a
i
+
1
a_i + a_{i+1}
ai+ai+1
=
=
=
a
i
∣
a
i
+
1
a_i \, | \, a_{i+1}
ai∣ai+1
+
+
+
a
i
&
a
i
+
1
a_i \, \& \, a_{i+1}
ai&ai+1
a
1
a_1
a1 的第
i
i
i 位确定后,即可递推判定
a
2
,
a
3
.
.
.
a
n
a_2,a_3...a_n
a2,a3...an 是否合法,递推(类似dp)判定合法性即可
code:
#include<bits/stdc++.h>
#define ll long long
#define _ 0
using namespace std;
const int maxn = 1e5 + 9;
int n;
int b[maxn], c[maxn];
void work()
{
scanf("%d", &n);
for(int i = 1; i < n; ++i) scanf("%d", &b[i]);
for(int i = 1; i < n; ++i)
scanf("%d", &c[i]), c[i] -= b[i];
int ans = 1;
for(int i = 0; i <= 31; ++i)// 枚举a1的第i位
{
int f0 = 1, f1 = 1;//初始默认a1的第i位 0、1均可取
for(int j = 1; j < n; ++j)// 判断选0和的1可行性
{// 这层循环第一次是将a1选1和0的可行性转移给a2,第二次a2转移给a3,依次递推
int x = b[j] >> i & 1;// |
int y = c[j] >> i & 1;// &
if(x && y) f0 = 0;// aj和aj+1第i位都是1,选0的可能性置为0
else if(x && !y) swap(f1, f0);// aj,aj+1 可以取 0,1 和 1,0
// aj+1第i位能取 1 由aj的 取0的情况(即f0)确定,能取 0 由aj取1的情况(即f1)确定
else if(!x && !y) f1 = 0;// aj和aj+1第i位都是0,选1的可能性置为0
else if(!x && y) f0 = f1 = 0;// 或是0,与不可能是1 ,选0选1都不行
}
ans *= f1 + f0;
}
cout << ans << endl;
}
int main()
{
//int TT;cin>>TT;while(TT--)
work();
return ~~(0^_^0);
}
Yet Another Problem About Pi
你有一条长
π
\pi
π 的线,你可以随意构造它的形状,变成圆都可以,然后给你一个
w
w
w 和
d
d
d , 在二维平面内,每隔w有一条竖线,每隔d有一条横线,问你通过画线,求曲线最多经过的方格数目
思路:
初始答案一定为
4
4
4,发现最大化方格的数目一定是去走到方格点的位置
到达方格点由两种方式,直接走(沿着长宽最小的一方走),斜着走
画图可以发现,每经过一个方格点,直着走答案+2,斜着走答案+3
设
a
a
a 为每到达一个方格点直着走的路程,
b
b
b 为斜着走的路程
答案就是对不等式
a
x
+
b
y
ax + by
ax+by
≤
\le
≤
π
\pi
π 的非负解求
2
x
+
3
y
2x+3y
2x+3y的最大值
枚举求x,y 最大值即可
#include<bits/stdc++.h>
#define ll long long
#define _ 0
using namespace std;
const int maxn = 1e5 + 9;
const int mod = 998244353;
const double pi = acos(-1);
ll n, m, k;
void work()
{
double w,d;
cin >> w >> d;
double a = min(w,d);
double b = sqrt(w * w + d * d);
// 直着和斜着走
int ans = 0;
for(int i = 0; i <= 10; ++i)
{
if(pi - i * a > 0) ans = max(ans, (int)(2 * i + (int)((pi - i * a) / b) * 3));
if(pi - i * b > 0) ans = max(ans, (int)(3 * i + (int)((pi - i * b) / a) * 2));
}
cout << ans + 4 << endl;
}
int main()
{
int TT;cin>>TT;while(TT--)
work();
return ~~(0^_^0);
}