补题*总结题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; }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15177509.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步