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


京公网安备 11010502036488号