文章目录
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1041
解题思路1:
1.string存储一个二维数组,设置两个字符串变量s1,s2
2.输入数据,保存在数组中
3.输入整数,根据整数来对应数组中的值进行输出
参考代码1:
#include <iostream>
using namespace std;
/*
解题思路:
1.string存储一个二维数组,设置两个字符串变量s1,s2
2.输入数据,保存在数组中
3.输入整数,根据整数来对应数组中的值进行输出
*/
int main()
{
string stu[1005][2], s1, s2; //切记数组中的行标要超过1000
int n, m, t;
cin >> n;
for(int i=0; i<n; i++)
{
cin >> s1 >> t >> s2;
stu[t][0] = s1;
stu[t][1] = s2;
}
cin >> m;
for(int i=0; i<m; i++)
{
cin >> t;
cout << stu[t][0] << " " << stu[t][1] << endl;
}
return 0;
}
解题思路2:
1.用结构类型来存储,然后循环找对应的输出即可
参考代码2:
#include<iostream>
using namespace std;
/*
解题思路:
1.用结构类型来存储,然后循环找对应的输出即可
*/
struct stu
{
long long a;
int b;
int c;
};
int main()
{
int n;
cin >> n;
stu s[n];
for(int i=0; i<n; i++)
cin >> s[i].a >> s[i].b >> s[i].c;
int m,tem;
cin >> m;
for(int i=0; i<m; i++)
{
cin >> tem;
for(int i=0; i<n; i++)
{
if(s[i].b==tem)
cout << s[i].a << " " << s[i].c << endl;
}
}
return 0;
}
1042
解题思路:
1.通过getline输入一个字符串
2.定义一个数组a
3.将字符串中所有字符改成小写
4.如果是小写字符,就按照字符的ascii码,输入到数组a中
5.假设a[0]是最大值,通过循环找出,最大值,以及对应的字符
参考代码:
#include<iostream>
#include<cctype>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
string s;
int a[26]={0};
getline(cin,s);
for(int i=0; i<s.length(); i++)
s[i]=tolower(s[i]);
for(int i=0; i<s.length(); i++)
if(islower(s[i]))
a[s[i]-'a']++;
int max=a[0],t=0;
for(int i=1; i<26; i++)
{
if(a[i]>max)
{
max=a[i];
t=i;
}
}
printf("%c %d",'a'+t,max);
return 0;
}
知识总结:
1.tolower ,toupper, isalpha, isalnum, islower,isupper用法:
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
/*tolower将字符改成小写
string str="THIS IS A";
for(int i=0; i<str.length(); i++)
str[i]=tolower(str[i]);
cout << str;*/
/*toupper将字符改成大写
string str="this is a";
for(int i=0; i<str.length(); i++)
str[i]=toupper(str[i]);
cout << str;*/
/*isalpha()判断一个字符是否为子母,如果是字符返回非0,否则返会0
cout << isalpha('2'); //返回0
cout << isalpha('A'); 返回非0
*/
/*isalnum用来判断是否为数字或者子母,
cout << isalnum('A'); 输出非0
cout << isalnum('2'); 输出非0
cout << isalnum('.'); 输出0
*/
/*islower判断是否为小写字母,是,返回非0;不是,返回0
cout << islower('a');
cout << islower('A');
*/
/*isupper判断是否为大写字母,是,返回非0,不是返回0
cout << isupper('A');
cout << isupper('a');
*/
}
1043
解题思路1:
1.首先输入字符串,将字符串中PATest对应的个数分别存放到a数组中,默认a[0]对应字符P,a[1]对应字符A…
2.用do-while循环,按照PATest的顺序输出字符,每输出一个字符个数减少1,然后循环判断是只要a数组中的数据元素一个不为0,就循环,只到所有字符按顺序输出完,这样数组a全是0,然后就结束循环.
参考代码1:
#include<iostream>
using namespace std;
/*
解题思路:
1.首先输入字符串,将字符串中PATest对应的个数分别存放到a数组中,默认a[0]对应字符P,a[1]对应字符A......
2.用do-while循环,按照PATest的顺序输出字符,每输出一个字符个数减少1,然后循环判断是只要a数组中的数据元素一个不为
0,就循环,只到所有字符按顺序输出完,这样数组a全是0,然后就结束循环
*/
int main()
{
string s;
int a[6]={0};
char c;
int j=0;
cin >> s;
for(int i=0; i<s.length(); i++)
{
if(s[i]=='P')
a[0]++;
if(s[i]=='A')
a[1]++;
if(s[i]=='T')
a[2]++;
if(s[i]=='e')
a[3]++;
if(s[i]=='s')
a[4]++;
if(s[i]=='t')
a[5]++;
}
do
{
if(a[0]!=0)
{
cout << 'P';
a[0]--;
}
if(a[1]!=0)
{
cout << 'A';
a[1]--;
}
if(a[2]!=0)
{
cout << 'T';
a[2]--;
}
if(a[3]!=0)
{
cout << 'e';
a[3]--;
}
if(a[4]!=0)
{
cout << 's';
a[4]--;
}
if(a[5]!=0)
{
cout << 't';
a[5]--;
}
}while(a[0]!=0 || a[1]!=0 || a[2]!=0 || a[3]!=0 || a[4]!=0 || a[5]!=0);
return 0;
}
解题思路2:
1.用cin.get()将字符串中的字符保存到其ASCII码下标的数组中
2.用while+if进行循环
参考代码2:
#include <iostream>
using namespace std;
/*
解题思路:
*/
int main()
{
int map[128]={0},c;
while ((c = cin.get()) != EOF) //表示没有到文件的结尾,判题的时候输入一个样例,就是到文件的结尾了
map[c]++;
while (map['P'] > 0 || map['A'] > 0 || map['T'] > 0 || map['e'] > 0 ||map['s'] > 0 || map['t'] > 0)
{
if (map['P']-- >0) //对于map['P']-- >0是先比较后自减,对于--map['P'] >0 是先自减后比较
cout << 'P';
if (map['A']-- >0)
cout << 'A';
if (map['T']-- >0)
cout << 'T';
if (map['e']-- >0)
cout << 'e';
if (map['s']-- >0)
cout << 's';
if (map['t']-- >0)
cout << 't';
}
return 0;
}
1044
解题思路:
1.还是用字符串数组保存参数
2.设置void func1和void func2函数分别表示将数字转换为火星文,将火星文转化为数字
3.对于func1而言:
1.对于t/13的除数放到b数组中查找
2.如t/13和t%13均不为0,则输出“ ”
3.对于t%13的数在a数组中查找,同时也要对t为0时,是在a数组中找
4.对于func2而言:
1.将str中0–2中的字符串赋值出来,如果字符串长度大于4,则将4–6字符串复制出来
2.for循环从1开始对于13以内的数字则s1==a[j]或者大于13则s2=a[j]
3.对于s1再在b数组中找,返回t1*13+t2;
参考代码:
#include <iostream>
#include <string>
#include<cstdio>
using namespace std;
/*
1.还是用字符串数组保存参数
2.设置void func1和void func2函数分别表示将数字转换为火星文,将火星文转化为数字
3.对于func1而言:
1.对于t/13的除数放到b数组中查找
2.如t/13和t%13均不为0,则输出“ ”
3.对于t%13的数在a数组中查找,同时也要对t为0时,是在a数组中找
4.对于func2而言:
1.将str中0--2中的字符串赋值出来,如果字符串长度大于4,则将4--6字符串复制出来
2.for循环从1开始对于13以内的数字则s1==a[j]或者大于13则s2=a[j]
3.对于s1再在b数组中找,返回t1*13+t2;
*/
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug","sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo","syy", "lok", "mer", "jou"};
//将字符串和长度len设置为全局变量,这样方便调用函数时,不用传入过多的参数
string s;
int len;
void func1(int t)
{
if (t/13)
cout << b[t/13];
if ((t/13) && (t%13))
cout << " ";
if (t%13 || t==0)
cout << a[t%13];
}
void func2()
{
int t1=0, t2=0;
string s1=s.substr(0,3),s2; //substr复制字符串的函数
if (len>4)
s2 = s.substr(4,3);
for (int j = 1; j <= 12; j++)
{
if (s1==a[j] || s2==a[j]) //为啥要填入s1=a[j]? 答:对于13进制以内的数有用,如feb=5;
t2=j;
if (s1==b[j])
t1=j;
}
cout << t1*13+t2;
}
int main()
{
int n;
cin >> n;
getchar(); //清除缓冲区的回车字符,注意以后在循环外和内中都要输入时,不要忘记加上getchar()消除缓冲区的字符
for (int i = 0; i < n; i++)
{
getline(cin, s);
len=s.length();
if (s[0]>='0' && s[0]<='9')
func1(stoi(s));
else
func2();
cout << endl;
}
return 0;
}
注意事项:
1.清除缓冲区的回车字符,注意以后在循环外和内中都要输入时,不要忘记加上getchar()消除缓冲区的字符
2.注意格式,在主函数中每次循环一次输出endl,但在自身的输入时不要加endl
知识总结:
1.stoi(将数字字符串改为整数)+s.substr(pos,n)(将字符串中的字符复制到另一个字符串中)
#include<iostream>
#include<string>
using namespace std;
int main()
{/*
string str="abcdef";
string a=str.substr(0,11);
cout << a;
0. 用途:一种构造string的方法
1. 形式:s.substr(pos, n)
2. 解释:返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
3. 补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾*/
/*字符串转化整数函数
string s="123";
cout << stoi(s);
*/
}
1045
解题思路1:
1.设置三个数组:abv分别表示原始数组,sort排列后的数组,主元元素数组
2.核心思路,找a与b数组中相同的数字,并且该数字大于前的最大值,因为如果a与b的某个数字相同,说明后面的元素
都比该元素大,故只用说明该数字大于之前的最大值即可
3.输出数组v
参考代码1:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int v[1000000];
int main()
{
int n,max=-1,cnt=0;
cin >> n;
vector<int> a(n),b(n);
for(int i=0; i<n; i++)
{
cin >> a[i];
b[i]=a[i];
}
sort(a.begin(),a.end());
for(int i=0; i<n; i++)
{
if(a[i]==b[i] && b[i]>max)
{
v[cnt++]=b[i];
}
if(b[i]>max)
max=b[i];
}
cout << cnt << endl;
for(int i=0; i<cnt; i++)
{
if(i!=0)
cout << " ";
cout << v[i];
}
cout << endl;
return 0;
}
注意事项:
1.输出主元元素的个数时,要换行
2.最后整个数组输出完后,加换行
解题思路2:
1.主元的判断条件:左边元素都比其小,右边的元素都比其大,或者换句话说,如果左边的某个数比其大或者右边的某个数比其小,则
不是主元
2.可以将合适的数组放到数组中,最后排序输出
参考代码2:
#include<iostream>
#include<algorithm>
using namespace std;
/*
*/
int main()
{
int n,num=0;
cin >> n;
int a[n],b[n];
for(int i=0; i<n; i++)
{
cin >> a[i];
b[i]=a[i];
}
sort(a,&a[n]);
for(int i=0; i<n; i++)
{
if(a[i]==b[i])
num++;
}
cout << num << endl;
for(int i=0; i<n; i++)
{
if(a[i]==b[i])
{
if(i!=0)
cout << " ";
cout << a[i];
}
}
return 0;
}
1046
解题思路:
1.设置四个,jiahan,jiahua,yihan,yihua, jiahe,yihe
2.逻辑如下
参考代码:
#include<iostream>
using namespace std;
/*
*/
int main()
{
int n;
cin >> n;
int jiahan,jiahua,yihan,yihua,jiahe=0,yihe=0;
for(int i=0; i<n; i++)
{
scanf("%d %d %d %d",&jiahan,&jiahua,&yihan,&yihua);
if(jiahua==jiahan+yihan && jiahua!=yihua)
yihe++;
if(yihua==jiahan+yihan && jiahua!=yihua)
jiahe++;
}
cout << jiahe << " " << yihe << endl;
return 0;
}
1047
解题思路:
1.必然有使用scanf输入
2.完全可以将最后成绩保存在队伍编号的数组中
参考代码:
#include<iostream>
using namespace std;
/*
*/
int main()
{
int n,duiwu,duiyuan,chengji,maxduiwu=0;
cin >> n;
int a[1001]={0};
for(int i=0; i<n; i++)
{
scanf("%d-%d %d",&duiwu,&duiyuan,&chengji);
a[duiwu]+=chengji;
}
for(int i=0; i<1001; i++)
{
if(a[i]>a[maxduiwu])
maxduiwu=i;
}
cout << maxduiwu << " " << a[maxduiwu];
return 0;
}
1048
解题思路:
1.将a,b字符串倒转过来
2.根据比较字符串长度,给较短位补0
3.设置str保存0,1…J,Q,K
4.对于原来的数位而言,从个位开始就是奇数位,下一位就是偶数位,如果倒转过来,第一位虽然是偶数位,但是
还是执行的是原来奇数位的操作。
5.每次循环时将计算结果累加到字符串c中,最后倒叙输出
参考代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string a,b,c;
string str="0123456789JQK";
cin >> a >> b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
if(a.length()>b.length())
b.append(a.length()-b.length(),'0');
else
a.append(b.length()-a.length(),'0');
for(int i=0; i<b.length(); i++)
{
if(i%2==0)
c+=str[(b[i]-'0'+a[i]-'0')%13];
else
{
int tem=b[i]-a[i];
if(tem<0)
tem+=10;
c+=str[tem]; //由于对应的数字位相减,所以最大差值为9,而c是字符串,所以也可以直接用str[tem]来连接
}
}
for(int i=c.length()-1; i>=0; i--)
cout << c[i];
return 0;
}
知识总结:
1.a.append(n,c)表示对字符串a的尾部添加n个字符c
2.reverse(a.begin(),a.end()) 对字符串a进行倒转
1049
解题思路1:
1.通过找规律,其实就是每个数字出现i*(n-i+1)次,
2.规律如下图:
参考代码:
#include<iostream>
using namespace std;
/*
解题思路:
*/
int main()
{
int n;
cin >> n;
double sum=0.0,tem;
for(int i=1; i<=n; i++)
{
cin >> tem;
sum+=tem*i*(n-i+1);
}
printf("%.2f",sum);
}
1050
解题思路:
1.先求合适的m,n
2.定义一个vector数组,并对其进行递减排序
3.用vector定义一个二维数组
4.用如下图的双循环,对二维数组赋值(设置原始数组a中的变量为t=0,依次将a数组中的值放到合适的二维数组位置,不要忘记t<N):
1.外层循环是以口字型顺时针循环,规律是根据行数m,通过找规律得出level=m/2+m%2
2.对于每一个外层循环来说,又有4个内层循环,分别是左上到右上、右上到右下、右下到左下、左下到左上的顺序⼀层层填充
5.用双层for循环输出二维数组,对j!=n-1的话,则输出空格保证最后一个数字没有多余的空格
参考代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
/*
解题思路:
*/
int cmp(int a, int b)
{
return a > b;
}
int main()
{
int N, m, n, t = 0;
scanf("%d", &N);
/*
题中要求m-n的值是所有可能值中最小的,m>=n; m*n=N。所以对于n取根号下N然后取整就表示想让
n与m值最接近,此时n的值一定小于等于N开根号也就满足m>=n,递减循环,如果有N整除n,则m=N/n,退出循环
*/
for (n=sqrt(N); n>=1; n--)
{
if (N%n==0)
{
m=N/n;
break;
}
}
vector<int> a(N);
for (int i=0; i<N; i++)
cin >> a[i];
sort(a.begin(), a.end(), cmp); //对数组递减排序
/*
用vector初始化一个元素全为0的数组
定义了一个vector容器,元素类型为vector<int>,初始化为包含m个vector<int>对象,
每个对象都是一个新创立的vector<int>对象的拷贝,
而这个新创立的vector<int>对象被初始化为包含n个0。
*/
vector<vector<int> > b(m, vector<int>(n));
/*
层数就是通过找规律得出,m为奇数,外层数是m/2+1;m为偶数,外层数就是m/2 则m=m/2+m%2
*/
int level=m/2+m%2;
for (int i=0; i<level; i++)
{
/*
第一个循环是从左上到右上,
*/
for (int j=i; j<n-i && t<N; j++)
b[i][j] = a[t++];
/*
第2个循环是从右上到右下
*/
for (int j=i+1; j<m-1-i && t < N; j++)
b[j][n - 1 - i] = a[t++];
/*
第3个循环是从右下到左下
*/
for (int j=n-i-1; j>=i && t<N; j--)
b[m-1-i][j] = a[t++];
/*
第4个循环是从左下到左上
*/
for (int j=m-2-i; j>=i+1 && t<N; j--)
b[j][i] = a[t++];
}
for (int i = 0; i < m; i++)
{
for (int j=0 ; j<n; j++)
{
printf("%d", b[i][j]);
if (j != n - 1)
printf(" ");
}
printf("\n");
}
return 0;
}
知识总结:
1.用vector将数组按照递减排序
#include<iostream>
#include<vector>
#include<algorithm>
int cmp(int a, int b)
{
return a > b;
}
int main()
{
vector<int> a;
sort(a.begin(),a.end(),cmp);
}
2.用vector设置二维数组
用vector初始化一个元素全为0的数组
定义了一个vector容器,元素类型为vector<int>,初始化为包含m个vector<int>对象,
每个对象都是一个新创立的vector<int>对象的拷贝,
而这个新创立的vector<int>对象被初始化为包含n个0。
vector<vector<int> > b(m, vector<int>(n));