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} pn1,现在给 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(练习)的主要内容,如果未能解决你的问题,请参考以下文章