卡码网 练习ACM模式 https://kamacoder.com/
11
可用静态链表存储树,最后求某个结点到共同树根的长度。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
int a,b;
vector<int> nums = vector<int>(30,0);
while(cin>>n)
{
while(n--){
cin>>a>>b;
nums[a]=b;
}
int len_ming = 0;
int len_yu =0;
int ming = nums[1];
int yu = nums[2];
while(ming !=0){
ming = nums[ming];
len_ming++;
}
while(yu!=0){
yu = nums[yu];
len_yu++;
}
if(len_ming>len_yu)
cout<<"You are my elder"<<endl;
else if(len_ming==len_yu)
cout<<"You are my brother"<<endl;
else if(len_yu>len_ming)
cout<<"You are my younger"<<endl;
}
return 0;
}
while True:
try:
n = int(input())
relations = {}
for _ in range(n):
a, b = map(int, input().split())
relations[a] = b
len_ming = 0
len_yu = 0
ming = relations.get(1, 0)
yu = relations.get(2, 0)
while ming != 0 and ming in relations:
ming = relations[ming]
len_ming += 1
while yu != 0 and yu in relations:
yu = relations[yu]
len_yu += 1
if len_ming > len_yu:
print("You are my elder")
elif len_ming == len_yu:
print("You are my brother")
else:
print("You are my younger")
except EOFError:
break
在访问 relations[ming] 之前,先判断一下 ming 是否在 relations 字典的键中。如果 ming 不在字典中,则说明已经找到了最后一个人,应该跳出循环。
12
#include <iostream>
int main() {
int n;
while (std::cin >> n) {
// 输出上半部分
for (int i = 1; i <= n; i++) {
// 输出前面的空格
for (int j = 1; j <= n - i; j++) {
std::cout << " ";
}
// 输出左半部分的数字
for (int j = 1; j <= i; j++) {
std::cout << j;
}
// 输出右半部分的数字
for (int j = i - 1; j >= 1; j--) {
std::cout << j;
}
// 输出后面的空格和换行符
std::cout << std::endl;
}
// 输出下半部分
for (int i = n - 1; i >= 1; i--) {
// 输出前面的空格
for (int j = 1; j <= n - i; j++) {
std::cout << " ";
}
// 输出左半部分的数字
for (int j = 1; j <= i; j++) {
std::cout << j;
}
// 输出右半部分的数字
for (int j = i - 1; j >= 1; j--) {
std::cout << j;
}
// 输出后面的空格和换行符
std::cout << std::endl;
}
}
return 0;
}
while True:
try:
n = int(input().strip())
# 输出上半部分
for i in range(1, n+1):
# 输出前面的空格
print(" " * (n-i), end="")
# 输出左半部分的数字
for j in range(1, i+1):
print(j, end="")
# 输出右半部分的数字
for j in range(i-1, 0, -1):
print(j, end="")
# 输出后面的空格和换行符
print()
# 输出下半部分
for i in range(n-1, 0, -1):
# 输出前面的空格
print(" " * (n-i), end="")
# 输出左半部分的数字
for j in range(1, i+1):
print(j, end="")
# 输出右半部分的数字
for j in range(i-1, 0, -1):
print(j, end="")
# 输出后面的空格和换行符
print()
except:
break
13
#include <iostream>
using namespace std;
int main() {
char c;
int n;
while (cin >> c >> n) {
if (c == '@') break;
for (int i = 1; i <= n; i++) {
if (i == n) {
for (int j = 0; j < 2 * n - 1; j++) {
cout << c;
}
} else {
for (int j = 0; j < 2 * n - 1; j++) {
if (j == n - i || j == n + i - 2) cout << c;
else cout << " ";
}
}
cout << endl;
}
cout<<endl;
}
return 0;
}
while True:
try:
s = list(input().split())
a = s[0]
n = int(s[1])
if a == '@':
break
else:
for i in range(1,n+1):
if i ==n:
print(a*(2*n-1))
else:
for j in range(2*n-1):
if (j==n+i-2) or (j==n-i) :
print(a,end="")
else:
print(' ',end="")
print()
print()
except:
break
Python中的print函数可以通过指定end参数来设置输出结尾字符,默认为换行符“\n”。在输出空格时,应该输出一个空格字符,而不是一个空字符串。
14
读取 n 后使用 cin.ignore() 来清除缓冲区中的换行符,然后再使用 getline(cin, s) 读取字符串。
cin.ignore(); // 清除换行符
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
cin.ignore(); // 清除换行符
while (n) {
string s;
getline(cin, s);
string abbreviation;
istringstream iss(s);
string word;
while (iss >> word) {
abbreviation += toupper(word[0]);
}
cout << abbreviation << endl;
n--;
}
return 0;
}
使用了一个 istringstream 类型的对象 iss,它可以将字符串按照空格分割成一个个单词。iss >> word 的含义就是从输入流中提取下一个单词,并将其存储到字符串变量 word 中。
在 C++ 中,对于字符串的拼接操作,使用 + 和 += 运算符的区别在于:
使用 + 运算符:
当你使用 s1 = s1 + toupper(word[0]); 这样的表达式时,实际上是创建了一个新的临时字符串,其中包含了将 s1 和 toupper(word[0]) 拼接后的结果,然后将这个新的字符串赋值给 s1。这意味着原始的 s1 字符串会被销毁,而新的字符串会分配内存来存储拼接后的结果。
使用 += 运算符:
当你使用 s1 += toupper(word[0]); 这样的表达式时,它会直接将 toupper(word[0]) 添加到 s1 的末尾,而不会创建新的临时字符串。这种方式更高效,因为它避免了不必要的内存分配和复制操作。
while True:
try:
n = int(input())
for i in range(n):
s = input().split()
s1 = ''
for j in range(len(s)):
s1 = s1+s[j][0]
s_upper = s1.upper()
print(s_upper)
except:
break
使用了字符串相加 + 的方式,这会将新的字符添加到已有字符串的末尾,注意前后关系
s.upper() 返回一个新的字符串,其中所有的小写字母都被转换为大写字母s.lower() 返回一个新的字符串,其中所有的大写字母都被转换为小写字母。
15
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n){
cin.ignore(); // 忽略换行符
while(n--){
string s1;
string s2;
getline(cin,s1);
int len;
len = s1.length();
if(len %2!=0)
{
break;
}
else
{
getline(cin,s2);
s1.insert(s1.size()/2,s2);
cout<<s1<<endl;
}
}
}
return 0;
}
使用了 getline(cin, s1) 和 getline(cin, s2) 来读取输入的字符串。但是要注意,当之前使用 cin >> n 读取整数时,输入流中可能会有一个换行符残留在缓冲区中。这个换行符会被 getline 函数读取到,并导致第一个 getline 函数直接返回空字符串。
为了解决这个问题,可以在读取整数后,使用 cin.ignore() 来忽略剩余的换行符,然后再开始读取字符串。
while True:
try:
n = int(input())
for i in range(n):
s1 = input()
s2 = input()
index = len(s1) // 2 # 计算插入位置
s1 = s1[:index] + s2 + s1[index:] # 将 s2 插入到 s1 的中间位置
print(s1)
except:
break
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
cin.ignore();
while(n>0){
string s;
char temp;
getline(cin,s);
int len;
len = s.length();
for (int i = 0;i<len;i++){
if(i%2==0)
{
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
cout<<s<<endl;
n--;
}
return 0;
}
while True:
try:
n = int(input())
for i in range(n):
s = list(input())
for i in range(len(s)):
temp = ''
if i%2 ==0:
temp = s[i]
s[i] = s[i+1]
s[i+1] = temp
print(''.join(s))
except:
break
在 Python 中,字符串是不可变的(immutable),因此无法通过索引赋值的方式来修改字符串中的单个字符。
使用 list() 函数将输入的字符串转换为列表,并使用 join() 方法将列表转换回字符串