2020.10.17天梯赛练习
题目:判断素数
思路:
数据较小,直接暴力就可,做的时候没有注意特判1的情况。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main(){ int n; cin >> n; for(int i = 0;i < n;i++){ int m; cin >> m; if(m == 1){ cout << "N0" << endl; continue; } int sign = 1; for(int i = 2;i <= sqrt(m);i++){ if(m % i == 0){ sign = 0; break; } } if(sign) cout << "Yes" << endl; else cout << "N0" << endl; } return 0; }
题目:出生年
思路:
这题当时做的时候,想着通过什么方法直接找出来,结果发现只需要枚举年份就可以了,枚举年份找到符合要求的即可。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int x[10]; int main(){ int year ,num; cin >> year >> num; for(int i = year;i < 3500;i++){ ll sum = 0; memset(x,0,sizeof(x)); x[i%10] = 1; x[i/10 % 10] = 1; x[i/100 % 10] = 1; x[i/1000] = 1; for(int j = 0;j < 10;j++) sum += x[j]; if(sum == num){ printf("%d %04d\n",i-year,i); break; } } return 0; }
题目:敲笨钟
思路:
做这道题时,我的思路就错了,我当时找的是ong子串位置,但这要如果其他位置出现ong,我就会错,这题其实是找逗号与句号,通过定位往前找ong,然后控制一下输出即可。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main(){ int t; string ss[150]; cin>>t; while(t--){ int sign1 = 0,sign2 = 0; int i = 0; while(cin >> ss[i]){ if(ss[i][ss[i].length()-1] == ','){ if(ss[i][ss[i].length()-4] == 'o' && ss[i][ss[i].length()-3] == 'n' && ss[i][ss[i].length()-2] == 'g'){ sign1 = 1; } } if(ss[i][ss[i].length()-1] == '.'){ if(ss[i][ss[i].length()-4] == 'o' && ss[i][ss[i].length()-3] == 'n' && ss[i][ss[i].length()-2] == 'g'){ sign2 = 1; } break; } i++; } if(sign1 && sign2){ for(int w = 0;w < i-2;w++){ cout<< ss[w] << " "; } cout << "qiao ben zhong." << endl; } else{ cout << "Skipped" << endl; } } return 0; }
题目:小字辈
思路:
用一个数组来记录辈分关系( v[x] 指的就是x的子辈集合),一个数组用来不断更新最小辈分成员(endn), 从最长辈往下进行dfs,最后便可更新出一个最小辈分数组,再按照要求输出。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> #include <vector> using namespace std; const long long N = 1e10 + 7; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) vector<int> v[500000]; vector<int> endn; int maxn; void dfs(int n,int deep){ for(int i = 0;i < v[n].size();i++){ dfs(v[n][i],deep+1); //对下一辈的进行搜索判断有无子代 } if(deep > maxn){ //如果有更小的子代,数组清空 maxn = deep; endn.clear(); endn.push_back(n); } else if(maxn == deep){ //辈分相同且最小,存进数组 endn.push_back(n); } } int main(){ int n,fa; cin >> n; for(int i = 1;i <= n;i++){ int x; cin >> x; if(x == -1){ fa=i; continue; } v[x].push_back(i);//把 x 的儿子放入 } dfs(fa,1); sort(endn.begin(),endn.end()); cout << maxn << endl; for(auto it = endn.begin();it != endn.end();it++){ if(it == endn.begin()) cout << *it; else cout << " " << *it; } cout << endl; }