2020.10.10天梯赛练习
题目:估值一亿的AI核心代码
思路:
这个题就是耐心的按照题目模拟就是了,还有一些格式需要注意,我是先将字符串改成小写,顺便进行了分割标点符号和其他符号,然后遍历分割单词存入字符串数组,后面再进行特殊单词单独变化,最后按照要求输出就行。
解题代码:
#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 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++) vector<string> vs; int main(){ int n; cin >> n; getchar(); while(n--){ string s; getline(cin,s); cout << s << endl; cout << "AI: "; for(int i = 0;i < s.size();i++){ if(s[i] >= 'A' && s[i] <= 'Z' ){ //换小写 if(s[i] != 'I') s[i] = s[i] - 'A' + 'a'; } else if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= '0' && s[i] <= '9') continue; else if(s[i] != ' '){ //s[i]为标点符号时,插入空格分离 s.insert(i," "); i++; } if(s[i] == '?') s[i] = '!'; } //将单词放入字符串数组 string sx = ""; for(int i = 0;i < s.size();i++){ if(s[i] != ' ') sx += s[i]; else if(sx != ""){ vs.push_back(sx); sx = ""; } } if(sx != "") //最后一个单词 vs.push_back(sx); //处理单词 for(int i = 0;i < vs.size();i++){ if(vs[i] == "I" || vs[i] == "me") vs[i] = "you"; if( (vs[i] == "can" || vs[i] == "could" ) && i < vs.size()-1 ){ if(vs[i+1] == "you"){ vs[i+1] = vs[i]; vs[i] = "I"; } } } for(int i = 0;i < vs.size();i++){ cout << vs[i]; if(i == vs.size() - 1){ break; } if(vs[i+1][0] == 'I' || vs[i+1][0] >= '0' && vs[i+1][0] <= '9' || vs[i+1][0] >= 'a' && vs[i+1][0] <= 'z') cout << ' '; } cout << endl; vs.clear(); } return 0; }
题目: N个数求和
这道题当初我就没看到,一直在做那些分高的。
思路:
N个数的求和,化简输出,就是两两进行求和,两个分数的求和就是求解一下最大公约数,化简后再与下一个进行运算。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const int maxn = 1e4 + 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++) ll num1[110],num2[110]; int main(){ int t; char c; cin >> t; cin >> num1[0] >> c >> num2[0]; ll N = num1[0],M = num2[0],temp; for(int i = 1;i < t;i++){ cin >> num1[i] >> c >> num2[i]; ll a = N*num2[i]+M*num1[i],b = num2[i]*M; temp = __gcd(a,b); a /= temp; b /= temp; N = a; M = b; } if(N % M==0) cout << N / M<< endl; else if(N < M) cout << N << "/" << M << endl; else cout << N/M << " " << N%M << "/" << M << endl; return 0; }
题目:链表去重
思路:
开一个结构体数组,结构体的序号结点的地址,结构体里面记录数据和下一个结点地址,一个数据标记数组,记录这个结点数据是否之前出现过,开两个数组记录分离后两链表结点的地址, 通过遍历后,再按照题目要求输出即可。
解题代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; struct point{ int date; int next; }p[101000]; int sign[100100]; int a[101000],b[101000]; int main(){ int star,n; cin >> star >> n; for(int i = 0;i < n;i++){ int x; cin >> x; cin >> p[x].date >> p[x].next; } int z = 0,k = 0; while(star != -1){ int nume = abs(p[star].date); if( sign[nume] == 0){ sign[nume] = 1; a[z++] = star; } else b[k++] = star; star = p[star].next; } for(int i = 0;i < z;i++){ if(i == 0) printf("%05d %d ",a[i],p[ a[i] ].date); else printf("%05d\n%05d %d ",a[i],a[i],p[ a[i] ].date); } printf("-1\n"); for(int i = 0;i < k;i++){ if(i == 0) printf("%05d %d ",b[i],p[ b[i] ].date); else printf("%05d\n%05d %d ",b[i],b[i],p[ b[i] ].date); } if(k) printf("-1\n"); }
题目:部落
思路:
整个社区的总人数,可以放进set,set的大小就是总人数,这种集合问题,肯定想通过并查集先处理好集合,处理完集合后,查询两人是否在同一部落的问题也解决了,这个不同部落的个数,我是预先存入了每个小圈子里的第一个人的编号,这样可以通过一个人找到整个小圈子人的父节点,把每个小圈子里父节点放入一个新set中,不同父节点个数即新set的大小就是不同部落个数。
当初写题时,那个一个圈子里只有一个人的情况,我忘记预存它的编号,导致老是有几个点没过,还是太菜了。
解题代码:
#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 = 1e6 + 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++) set<int>s; set<int>ss; int setfrist[maxn]; int faset[maxn]; int fa[maxn]; int Find(int x) { if(fa[x] == x) return x; else return fa[x] = Find(fa[x]); } void hebing(int a,int b) { int fx = Find(a),fy = Find(b); if(fx != fy) fa[fx] = fy; } int main() { for(int i = 1;i <= maxn;i++){ fa[i] = i; } int t,n; cin >> t; for(int j = 0;j < t;j++){ cin >> n; int a,b; if(n == 1){ cin >> a; s.insert(a); } if(n >= 2){ cin >> a >> b; hebing(a,b); s.insert(a); s.insert(b); } setfrist[j] = a; for(int i = 3;i <= n;i++){ int c; cin >> c; s.insert(c); hebing(a,c); } } for(int i = 0;i < t;i++){ ss.insert( Find( setfrist[i] ) ); } cout << s.size() << " " << ss.size() << endl ; int m; cin >> m; while(m--){ int x,y; cin >> x >> y; if(Find(x) == Find(y)) cout << 'Y' << endl; else cout << 'N' << endl; } return 0; }

浙公网安备 33010602011771号