L1-3 敲笨钟 (20分)
思路:直接根据",","."找到后一个词,判断是不是押"ong",若都押韵,则把后半句的后3个词换成"qiao ben zhong."
注意点:使用substr(beginIndex, len)时,首先得判断s的长度是不是大于(beginIndex + len),不然会越界
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
getchar();
while(n--){
string s;
getline(cin, s);
int flag1, flag2;
flag1 = flag2 = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == ','){
//注意i>=3不然数组会越界
if(i >=3 && s.substr(i - 3, 3) == "ong"){
flag1 = 1;
}else
break;
}
if(s[i] == '.'){
//注意i>=3不然数组会越界
if(i >=3 && s.substr(i - 3, 3) == "ong"){
flag2 = 1;
}
}
}
if(flag1 && flag2){
int cnt = 0; //空格的个数
for(int i = s.size() - 1; i >= 0; i--){
if(s[i] == ' ')
cnt++;
if(cnt == 3){//第3个空格,将后面的3个字换成"qiao ben zhong."
cout<<s.substr(0, i)<<" qiao ben zhong."<<endl;
break;
}
}
}else{
printf("Skipped\n");
}
}
return 0;
}
L1-8 估值一亿的AI核心代码 (20分)
思路:模拟
注意点:我这种写法的时候,can you/ could you 和 I /me进行变换应该放在同一个循环里,不然可能变2次,例如can you-> I can ->you can或者can I->can you ->I can
#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
getchar();
for(int i = 1; i <= n; i++)
{
string s;
getline(cin, s);
cout<<s<<endl;
string str = "";
int flag = 1;//行首空格
for(int i = 0; i < s.size(); i++)
{
if(flag && s[i] == ' ')//去行首空格
{
}
else
{
flag = 0;
str = str + s[i];
}
}
s = "";
//处理标点前的空格
for(int i = 0; i < str.size(); i++)
{
if(str[i] == ' ')
{
while(str[i] == ' ')
i++;
i--;
char c = str[i+1];
if(ispunct(c))
i++;
}
s = s + str[i];
}
//cout<<s<<endl;
int cnt = 0;
//处理行尾的空格
for(int i = s.size() - 1; i >= 0; i--)
{
if(s[i] == ' ')
cnt++;
else
break;
}
s = s.substr(0, s.size() - cnt);
//cout<<s<<endl;
//把原文中所有大写英文字母变成小写,除了 I
for(int i = 0; i < s.size(); i++)
{
if(s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'I')
s[i] = s[i] + 'a' - 'A';
}
// cout<<s<<endl;
str = "";
//把原文中所有独立的 can you、could you 对应地换成 I can、I could
//必须放在一个循环里面,否则可能can you-> I can ->you can或者can I->can you ->I can
for(int i = 0; i < s.size(); i++)
{
if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s.substr(i,7) == "can you" && ( i + 7 == s.size()|| s[i + 7] == ' '|| ispunct(s[i+7])))
{
str = str + "I can";
i += 6;
}
else if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s.substr(i,9) == "could you" && ( i + 9 == s.size()|| s[i + 9] == ' '|| ispunct(s[i+9])))
{
i += 8;
str = str + "I could";
}
else if(s[i] == '?')
str = str + "!";
else if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s[i] == 'I' && ( i + 1 == s.size()|| s[i + 1] == ' ' || ispunct(s[i+1])))
str = str + "you";
else if((i == 0 || s[i-1] == ' ' || ispunct(s[i-1])) && s.substr(i,2) == "me" && ( i + 2 == s.size()|| s[i + 2] == ' '|| ispunct(s[i+2])))
{
i++;
str = str + "you";
}
else
str = str + s[i];
}
cout<<"AI: "<<str<<endl;
}
return 0;
}
L2-1 特立独行的幸福 (25分)
思路:先筛出区间中依附于其他数字的幸福数,然后对不是依附于其他数字的幸福数计算出独立性即可,注意素数需要加倍
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 2e4 + 10;
int isOk[maxn];
int vis[maxn];//1表示依附于别的数的幸福数
int fun(int x)
{
int cnt = 0;
while( cnt < 100){//循环超过100次基本可以认为死循环
int res = 0;
while(x > 0){//计算平方数
res += (x % 10) * (x % 10);
vis[res] = 1;
x /= 10;
}
x = res;
cnt++;
if(x == 1)break;
}
if(cnt >= 100)
return -1;
else
return cnt;
}
int isprime(int x)
{
if(x < 2)
return 0;
for(int i = 2; i * i <= x; i++){
if(x % i == 0)
return 0;
}
return 1;
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
for(int i = a; i <= b; i++){
fun(i);//先找出所有依附于其他数字的数字
}
int cnt = 0;
for(int i = a; i <= b; i++){
if(vis[i]){//依附于其他数字的数字,不输出
continue;
}
else{
int n = fun(i);//计算当前数的独立性
if(n != -1 && n != 100){
cnt++;
if(isprime(i))
printf("%d %d\n", i, 2 * n);
else
printf("%d %d\n", i, n);
}
}
}
if(cnt == 0)
printf("SAD\n");
return 0;
}
L2-3 深入虎穴 (25分)
思路:找到入度为0的点,然后用dfs分别求出每条路之前有几个门即可。
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
struct node
{
int next;
int to;
} a[maxn];
int head[maxn];
int in[maxn];
int vis[maxn]; //通完当前道路需要通过几个门
int cnt = 0; //边的编号
int n; //顶点数量
void add(int u, int v)
{
a[cnt].to = v;
a[cnt].next = head[u];
head[u] = cnt++;
}
void dfs(int u)
{
for(int i = head[u]; ~i; i = a[i].next)
{
int v = a[i].to;
if(!vis[v])
{
vis[v] = vis[u] + 1;
dfs(v);
}
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
head[i] = -1;
for(int i = 1; i <= n; i++)
{
int num;
scanf("%d", &num);
while(num--)
{
int to;
scanf("%d", &to);
in[to]++;
// cout<<to<<" "<<in[to]<<endl;
add(i, to);
}
}
for(int i = 1; i <= n; i++)
{
if(in[i] == 0)
{
vis[i] = 1;
dfs(i);
break;
}
}
int maxn = 0, index = 1;
for(int i = 1; i <= n; i++)
{
// cout<<i<<":"<<vis[i]<<endl;
if(vis[i] > maxn)
{
maxn = vis[i];
index = i;
}
}
printf("%d\n", index);
return 0;
}