补题*总结题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;
}