pat 乙级 1041~1050

文章目录

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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值