ACM 寒假第一讲:C++ 基础
第一题:long loong
include<stdio.h>
int main(){
int N;
scanf("%d",&N);
printf("L");
for(int i=0;i<N;i++){
printf("o");
}
printf("ng");
return 0;
}
思路:要求输入有N个o的字符串long,先输入一个整数N,然后输出"L",用for循环输出N个o,最后输出ng
第二题:
include <stdio.h>
include <ctype.h>
include <string.h>
int main() {
int N;
scanf("%d", &N);
char a[100];
for (int i = 0; i < N; i++) {
scanf("%s", a);
for (int j = 0; a[j] != '\0'; j++) {
a[j] = toupper(a[j]);
}
if (strcmp(a, "YES") == 0) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
思路:要求判断字符串是否等于“YES”,首先输入要判断的字符串个数,再定义一个字符数组,遍历数组输入字符,为方便判断,统一转换为大写字母,用toupper函数实现,然后用if语句判断字符串并输出结果
第三题:
include<stdio.h>
include<string.h>
int main(){
char a[61];
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%s",a);
int l=strlen(a);
int x=((int)a[l-1])-48;
if(x%2==0){
printf("even\n");
}
else{
printf("odd\n");
}
}
return 0;
}
思路:第一次做的时候没有考虑到数字的大小,直接用int型定义了导致错误,更正后如下:定义一个整型数组,输入要判断的数的个数N,输入要判断的整数,用strlen取整数的长度,由于判断整数的奇偶可以只看个位,所以我直接取个位数来判断,用if语句判断并输出结果
第四题:
include <stdio.h>
include <string.h>
int main() {
int t, n, m;
scanf("%d", &t);
while (t--) {
scanf("%d %d", &n, &m);
char a[51];
scanf("%s", a);
int count[7] = {0};
for (int i = 0; i < n; i++) {
count[a[i] - 'A']++;
}
int needed = 0;
for (int i = 0; i < 7; i++) {
if (count[i] < m) {
needed += m - count[i];
}
}
printf("%d\n", needed);
}
return 0;
}
思路:输入测试用例的数量t,输入轮数m和题数n,然后输入字符串a,定义一个大小为 7 的数组count,用于统计字符串中每个字符的出现次数,最后计算需要出的额外题目数,当出现次数小于轮数时,需要额外出题,最后输出需要出的额外题目数
第五题:
include
include
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> records[i][j];
}
}
int days= 0;
for (int i = 0; i < m; i++) {
int count_k = 0;
for (int j = 0; j < n; j++) {
if (records[i][j] == k) {
count_k++;
}
}
if (count_k >= (n + 1) / 2) {
days++;
}
}
if (days >= (m + 1) / 2) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
思路:定义一个二维数组records,用于存储输入的数据,通过嵌套循环读取矩阵中的每个元素,存储到 records 中,在每一行中,用变量 count_k 统计目标值 k 的出现次数,如果在某一行中,k 的出现次数大于或等于该行元素总数的一半((n + 1) / 2),则将 days 的值加 1,最后用if语句判断并输出结果
第六题:
include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
int q;
cin>>q;
char ch1,ch2;
char k[27],m[27];
for(int i=0;i<27;i++){
k[i]='a'+i;
m[i]='a'+i;
}
for(int i=0;i<q;i++){
cin>>ch1>>ch2;
for(int j=0;j<27;j++){
if(k[j]ch1){
k[j]=ch2;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<27;j++){
if(s[i]m[j]){
s[i]=k[j];
break;
}
}
}
cout<<s;
return 0;
}
思路:这题一开始不会,听完讲评之后理解一些了,程序的目标是:读取一个字符串 s 和一组字符替换规则。根据这些规则,将字符串中的字符逐个替换。输出最终替换后的字符串。n是字符串的长度,s是需要进行字符替换的原始字符串,q是替换规则的数量。ch1 和 ch2 用于存储每条替换规则中的字符。k 和 m 是两个大小为 27 的字符数组,用于存储替换规则和原始字符映射。k用于存储最终的字符映射关系。m用于存储原始字符('a' 到 'z',加上一个额外的字符,总共 27 个)。循环读取 q 条替换规则,每条规则包含两个字符 ch1 和 ch2。对于每条规则,遍历数组 k,将所有等于 ch1 的字符替换为 ch2。循环读取 q 条替换规则,每条规则包含两个字符 ch1 和 ch2。对于每条规则,遍历数组 k,将所有等于 ch1 的字符替换为 ch2,最后输出最终替换后的字符串。
第七题:
include
using namespace std;
int num[1005][1005];
int main()
{
int x,y,op,n,m;
cin>>x>>y;
for(int i=1;i<=x;i++){
for(int j=1;j<=x;j++){
cin>>num[i][j];
}
}
int h[1005],l[1005];
for(int i=1;i<=1005;i++){
h[i]=i;
l[i]=i;
}
while(y--){
cin>>op>>n>>m;
switch(op){
case 0:{
int temp=l[n];
l[n]=l[m];
l[m]=temp;
break;
}
case 1:{
int temp=h[n];
h[n]=h[m];
h[m]=temp;
break;
}
}
}
for(int i=1;i<=x;i++){
for(int j=1;j<=x;j++){
cout<<num[h[i]][l[j]]<<" ";
}
cout<<endl;
}
return 0;
}
思路:一开始用常规思路做然后超时了,跟同学讨论之后借鉴了同学的思路,以行或列为单位交换,缩短运行时间
学习总结:刚接触c++,还不太会用,前面一些题目用的还是c语言,另外在解题思路上还有些死板,通过这一专题的学习有了一些启发,后续学习中将会继续认真学习c++语法以及解题思路。