7-1 估值一亿的AI核心代码 (20point(s))
解法:这一题题意比较简单,但是要注意细节,主要是要对string的函数进行熟悉和掌握,
代码:
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; getchar(); while (n--) { string s; getline(cin, s); cout << s << endl; while (s[0] == ' ') s.erase(s.begin()); while (s[s.length() - 1] == ' ') s.erase(s.end() - 1); for (int i = 0; i<s.length(); i++){/*遍历这个字符串*/ if (s[i] == ' ') {/*如果当前位置为空*/ while (s[i + 1] == ' '){ s.erase(s.begin() + i + 1); } if (!isalnum(s[i+1])){ s.erase(s.begin() + i); } } } for (int i = 0; i<s.length(); i++){ if (s[i] >= 'A'&&s[i] <= 'Z'&&s[i] != 'I'){/*大写转变为小写*/ s[i] -= 'A' - 'a'; } } for (int beg = 0;; beg++) { beg = s.find("can you", beg); if (beg == -1)break; if ((!beg||!isalnum(s[beg-1]))&&(beg+7==s.length()||!isalnum(s[beg+7]))){ s.replace(beg,7,"A can"); } } for (int beg = 0;; beg++) { beg = s.find("could you", beg); if (beg == -1)break; if ((!beg||!isalnum(s[beg-1]))&&(beg+9==s.length()||!isalnum(s[beg+9]))){ s.replace(beg,9,"A could"); } } for (int beg = 0;; beg++) { beg = s.find("I", beg); if (beg == -1)break; if ((!beg||!isalnum(s[beg-1]))&&(beg+1==s.length()||!isalnum(s[beg+1]))) s.replace(beg,1,"you"); } for (int beg = 0;; beg++) { beg = s.find("me", beg); if (beg == -1)break; if ((!beg||!isalnum(s[beg-1]))&&(beg+2==s.length()||!isalnum(s[beg+2]))) s.replace(beg,2,"you"); } for (int i=0; i<s.length(); i++) { if (s[i] == '?')s[i] = '!'; if (s[i] == 'A')s[i] = 'I'; } cout << "AI: " << s << endl; } return 0; }
7-3 N个数求和 (20point(s))
这一题思路也是比较简单,可惜当时脑子想复杂了,不然肯定可以过。
#include<iostream> #include<algorithm> using namespace std; int main(){ int N;/*数的个数*/ cin>>N; getchar(); char c; int fenzi,fenmu,a,b; cin>>fenzi>>c>>fenmu; a=fenzi,b=fenmu; for(int i=0;i<N-1;i++){ cin>>fenzi>>c>>fenmu; a=a*fenmu+b*fenzi; b=b*fenmu; } /*其中 a,代表分子 b代表分母*/ int f=1;/*该数为正*/ if(a==0){ cout<<0<<endl; return 0; }else if(a<0){/*该数为负*/ f=0; a=-a; }else{/*该数为正*/ f=1; } int num=__gcd(a,b); a=a/num,b=b/num; if(a%b==0){/*能够整除*/ if(f){ cout<<a/b<<endl; }else{ cout<<'-'<<a/b<<endl; } }else{/*不能够整除*/ if(a>b){ int inter=a/b; a=a%b; if(f){/*是个整数*/ cout<<inter<<" "<<a<<'/'<<b<<endl; }else{/*是个负数*/ cout<<'-'<<inter<<" "<<a<<'/'<<b<<endl; } }else if(a<b){ if(f) cout<<a<<'/'<<b<<endl; else cout<<'-'<<a<<'/'<<b<<endl; }else{/*a==b*/ if(f) cout<<1<<endl; else cout<<-1<<endl; } } return 0; }
7-9 名人堂与代金券 (25point(s))
这一题也是个水题,但是要注意它的输出要求,分数相同的情况下,排名的名次是一样的。#include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; struct stu{ string name;/*名字*/ int score;/*分数*/ int g; }st[10050]; bool cmp(stu a,stu b){ if(a.score==b.score){ return a.name<b.name; }else{ return a.score>b.score; } } int main(){ int N,G,K; cin>>N>>G>>K; int sum_money=0; for(int i=0;i<N;i++){ cin>>st[i].name>>st[i].score; st[i].g=0; if(st[i].score>=60&&st[i].score<G){ sum_money=sum_money+20; }else if(st[i].score>=G){ sum_money=sum_money+50; } } sort(st,st+N,cmp); cout<<sum_money<<endl; int num=1;/*排名是第一位, 名次变量*/ st[0].g=num; for(int i=1;i<N;i++){ if(st[i].score==st[i-1].score){ st[i].g=num; }else{ num=i+1; st[i].g=num; } } for(int i=0;i<N;i++){ if(st[i].g<=K){ cout<<st[i].g<<" "<<st[i].name<<" "<<st[i].score<<endl; } } return 0; }
7-11 部落 (25point(s))
并查集算法的简单应用。#include<iostream> #include<set> #include<algorithm> using namespace std; int father[10010]; int n,q; void init() { for(int i=0; i<10010; i++) { father[i]=i; } } int Find(int a) { if(a==father[a]) { return a; } else { return father[a]=Find(father[a]); } } void merge(int a,int b) { int f1=Find(a); int f2=Find(b); if(f1!=f2) { father[f1]=f2; } } set<int> st; int main() { init(); cin>>n; for(int i=0;i<n;i++){ int a,b; cin>>a; a--; cin>>b; st.insert(b); int fa=Find(b); while(a--){ cin>>b; st.insert(b); int fb=Find(b); if(fa!=fb){ father[fb]=fa; } } } int cnt=0; for(set<int>::iterator it=st.begin();it!=st.end();it++){ if(father[*it]==*it){ cnt++; } } int q,a,b; cout<<st.size()<<' '<<cnt<<endl; cin>>q; while(q--){ cin>>a>>b; if(Find(a)==Find(b)){ cout<<'Y'<<endl; }else{ cout<<'N'<<endl; } } // cout<<cnt<<endl;/*群体的数量*/ return 0; }