补题*总结题21/8/23

B - Primes

Gym - 102267B
题意:给你一个质数N,判断该质数能不能由两个质数的和构成,如果能构成输出这两个质数,否则输出-1。
思路:质数除了2,一定不是偶数;而两个奇数之和一定是偶数,故只有N-2是质数时,才可能成立,故只需要判断n-2是不是质数即可。
代码:

提示:判断质数只需要判断2---sqrt(n)〖根号N〗

#include <bits/stdc++.h>
using namespace std;
int n;
int prime(long long int k)
{
    long long int i,o;
    int w=1;
    for(i=2;i<=sqrt(k);i++)
    {
        o=k%i;

        if(o==0)
        {
            w=0;
            break;
        }
    }
    return w;
}
int main()
{

    cin>>n;
    if(n==2)
       {
        cout<<"-1"<<endl;
        return 0;
       }
    if(n==3)
       {
        cout<<"-1"<<endl;
        return 0;
       }
    int b=prime(n-2);
   // cout<<b<<endl;
   if(b==1) cout<<2<<" "<<n-2<<endl;
   else cout<<"-1"<<endl;

    return 0;
}

H - Circle of Polygon

Gym - 102267H
题意:求正N边形的外接圆面积
思路:分割三角形,求角度用sin和d/2得出半径
代码:

提示:sin和cos计算的是弧度,故角度需要换成弧度(公式:弧度 =角度*(π/180°) )


#include <bits/stdc++.h>
using namespace std;

#define PI 3.1415926535
int main()
{
   int v,s;//顶点数和边长
   cin>>v>>s;
   double j=360.0/(v*2.0) *(PI/180.0);
     //cout<<sin(j)<<endl;
    double r=(s/2.0)/sin(j);
    double S=r*r*PI;
    printf("%.9lf",S);
   // cout<<S<<endl;
    return 0;
}

K - Birthday Puzzle

Gym - 102267K
题意:给一个数组,求数组的---所有子数组内部做OR运算的值---的和

**思路:**枚举出每个子数组,暴力,
代码1:

1 << n二进制每左移一位就是*2,两位就是*2*2,三位就是*2*2*2.

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll a[25];
ll cnt, num = 0;//这里要记得long long
void solve(int n)
{
/*
外层循环 i 的值为 1 到 2n ,代表了所有取的情况(不取零个),
从取一个元素 到 取所有元素,
并且每一种取法(取x个)对应的所有方案都存在,做到不重不漏。
内层循环 j 遍历一遍数组,用 i & (1 << j ) 判断要取哪几个
*/
    for (int i = 0; i < (1 << n); i++)
    {
        cnt = 0;
        for (int j = 0; j < n; j++)
            if (i & (1 << j))
                cnt = cnt | a[j];//某个子集内的所有元素取或
        num += cnt;//求和
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    solve(n);
    printf("%lld\n", num);
    return 0;
}

代码2

#include <bits/stdc++.h>
using namespace std;
int a[100];
int n;
long long  sum;

void abc(int x, int y)
{
    for(int i = x + 1;i<=n;i++)
    {
        long long  z = a[i] | y;
        sum += z;
        abc(i, z);
    }
}
int main()
{
    sum = 0;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
    }

    for(int i=1;i<=n;i++)
    {
       sum += a[i];
        abc(i, a[i]);
    }

    cout <<  sum << endl;
    return 0;
}

I - Ultimate Army

Gym - 102267I
题意:n个人每个人都有一个boss,只有老板自己没有,
依次输出第i个人的boss。
4(2)的意思是2的boss是4。
思路:用堆栈。
代码:

#include <bits/stdc++.h>
 
using namespace std;
 
const int maxn = 2e6+10;
 
char a[maxn];
int pre[maxn];
 
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s",a);
    stack <int> S;
    memset(pre,0,sizeof(pre));
    int len = strlen(a);
    for ( int i=0; i<len; i++ )
    {
        if ( a[i]>='0' && a[i]<='9' )  // 如果是数字进入
        {
            int x = 0;
            while ( a[i]>='0' && a[i]<='9' )
            {
                x = x*10 + a[i]-'0'; // 字符串多位数转int
                i ++;
            }
            i --;
            if ( S.empty() )
            {
                S.push(x);
            }
            else
            {
                pre[x] = S.top();
                S.push(x);
            }
        }
        else if( a[i]==')' ) // 如果是) 那么会和前一个(消掉 所以pop一个数字出来
        {
            S.pop();
        }
    }
    for ( int i=1; i<n; i++ )
    {
        printf("%d ",pre[i]);
    }
    printf("%d\n",pre[n]);
 
    return 0;
}

D - Robots Easy

Gym - 102267D
题意:已知一个图(自带不能通过的点和终点),给你一个起始点,让你求得一个到终点的路径,(只要长度不大与1000就可以,没必要是最短路径
思路:抄的(原文):由于步数不超过 1000 且可以输出任意方案,那么对于任意一个点,只要让其走到左下角,然后向右两步再向上两步一定有解
代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
const int MOD = 1E9+7;
const int N = 20+5;
const int dx[] = {1,-1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
 
int main() {
    int l;
    scanf("%d",&l);
    for(int i=1;i<=l;i++){
        int r1,c1;
        scanf("%d%d",&r1,&c1);
        printf("40\n");
        //向下12步,向左12步,再向下12步一定可以走到右下角
        for(int i=1;i<=12;i++)
            printf("D");
        for(int i=1;i<=12;i++)
            printf("L");
        for(int i=1;i<=12;i++)
            printf("D");
 
        printf("RRUU\n");//向右2步向上2步
    }
 
    return 0;
}
posted @ 2021-08-23 20:24  kingwzun  阅读(40)  评论(0编辑  收藏  举报