AtCoder Beginner Contest 197(练习)
Posted 佐鼬Jun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 197(练习)相关的知识,希望对你有一定的参考价值。
C - ORXOR
题意: 给n个数,把n个数分成任意组,对每个组的数进行OR运算(或运算),对每个组的结果进行XOR运算(异或运算),最后输出最小的异或值。
思路: 数据范围很小,可以状态压缩来枚举所有分组的情况,分组就代表着再哪个地方放上一个隔板,隔板之间的组XOR,隔板之内的数OR运算。总共有2n放隔板的方案(因为包含可以不放),利用二进制,哪一位有1,那个地方就放隔板。最后取最小值。
关键: 把230种情况,利用二进制来枚举
注意: 一开始存答案的值取2147483647,不能取0x3f3f3f3f,因为数据里面最大的数就是int范围最大值。
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
#define ll long long
#define inf 0x3f3f3f3f
int n;
int a[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
int ans = 2*inf;
for (int i = 0; i < (1 << n); i++) {
int OR = 0, XOR = 0;
for (int j = 1; j <= n; j++) {
OR |= a[j];
if ((i & (1 << j))) {
XOR ^= OR;
OR = 0;
}
}
XOR ^= OR;
ans = min(ans, XOR);
}
printf("%d\\n", ans);
return 0;
}
D - Opposite
题意: 在二维平面x-y坐标轴上,给一个n正多边形,它有n个点(b保证是偶数),n个点的坐标是呈现逆时针排布,
p
0
p_0
p0
p
1
p_1
p1
p
2
p_2
p2…
p
n
−
1
p_{n-1}
pn−1,现在给
p
0
p_0
p0
p
n
/
2
p_{n/2}
pn/2的坐标,让你输出
p
1
p_1
p1的坐标
思路: 就是个计算几何题
下面是博主的思路,也是借鉴了CSDN其他大佬的思路
(画图比较难看,还有写错的字,太菜了)
也算是对这个公式记个笔记
关键就是绕点旋转公式:
x=(
x
0
x_0
x0-
x
m
x_m
xm)
c
o
s
α
cosα
cosα-(
y
0
y_0
y0-
y
m
y_m
ym)
s
i
n
α
sinα
sinα+
x
m
x_m
xm
y=(
x
0
x_0
x0-
x
m
x_m
xm)
s
i
n
α
sinα
sinα+(
y
0
y_0
y0-
y
m
y_m
ym)
c
o
s
α
cosα
cosα+
y
m
y_m
ym
#include<bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);
int main() {
double n,x0,y0,xm,ym,x,y,a;
cin>>n>>x0>>y0>>xm>>ym;
a=2*PI/n;
x=(x0+xm)/2;
y=(y0+ym)/2;
double x1=(x0-x)*cos(a)-(y0-y)*sin(a)+x;
double y1=(x0-x)*sin(a)+(y0-y)*cos(a)+y;
printf("%.10lf %.10lf\\n",x1,y1);
return 0;
}
To be continued
如果你有任何建议或者批评和补充,请留言指出,不胜感激
以上是关于AtCoder Beginner Contest 197(练习)的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解