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;
}