美文网首页
2019-08-06(甲级1题,乙级5题)

2019-08-06(甲级1题,乙级5题)

作者: MuserQuantity | 来源:发表于2019-08-06 17:39 被阅读0次

    甲级

    1002

    这道题有个坑,就是系数为0的时候不算,这个需要在算完之后再逐项挑出来。此题是姥姥和何老师开的的数据结构慕课里,何老师讲授的多项式的求和。下意识地用了链表来写,无奈于突然忘了链表怎么构建,想到可以用vector,搭配struct结构体来快速模拟。于是有了第一种方法(这种方法有点麻烦,因为其实原题目中指数N的范围只有[0,1000],少得可怜,完全可以直接开数组来做,但确实会有点浪费空间就是了。):

    #include <iostream>
    #include <stdio.h>
    #include <vector>
    using namespace std;
    
    int main(){
        typedef struct{
            int k;
            float a;
        }node;
        vector<node> p1,p2;
        //输入,分别存到p1,p2
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            node temp;
            cin>>temp.k>>temp.a;
            p1.push_back(temp);
        }
        int m;
        cin>>m;
        for(int i=0;i<m;i++){
            node temp;
            cin>>temp.k>>temp.a;
            p2.push_back(temp);
        }
        //遍历,把p2的元素插入到p1
        int i1=0,i2=0;
        while(i1<p1.size()&&i2<p2.size()){
            if(p1[i1].k<p2[i2].k){
                p1.insert(p1.begin()+i1,p2[i2]);
                i1++;
                i2++;
            }
            else if(p1[i1].k==p2[i2].k){
                p1[i1].a+=p2[i2].a;
                i1++;
                i2++;
            }
            else{
                i1++;
            }
        }
        //p2剩下的继续插入到p1的尾部
        while(i2<p2.size()){
            p1.insert(p1.end(),p2[i2]);
            i2++;
        }
        //在这里卡了大半天,细心点啊,数个数的时候也要判断是否为0
        int cnt=0;
        for(int i=0;i<p1.size();i++){
            if(p1[i].a!=0) cnt++;
        }
        cout<<cnt;
        for(int i=0;i<p1.size();i++){
            if(p1[i].a!=0) printf(" %d %.1f",p1[i].k,p1[i].a);
        }
        return 0;
    }
    

    然后是第二种方法,直接开数组,空间换时间的方法(其实也换不了多少时间):

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    int main(){
        float b[1001];
        for(int i=0;i<1001;i++) b[i]=0;
        //输入
        int n,m;
        cin>>n;
        for(int i=0;i<n;i++){
            int k;
            float a;
            scanf("%d%f",&k,&a);
            b[k]+=a;
        }
        cin>>m;
        for(int i=0;i<m;i++){
            int k;
            float a;
            scanf("%d%f",&k,&a);
            b[k]+=a;
        }
        //输出,记得算个数和输出项的时候都要判断是否为0
        int cnt=0;
        for(int i=1000;i>=0;i--){
            if(b[i]!=0)cnt++;
        }
        cout<<cnt;
        for(int i=1000;i>=0;i--){
            if(b[i]!=0) printf(" %d %.1f",i,b[i]);
        }
        return 0;
    }
    

    乙级

    1036 跟奥巴马一起编程

    这题就算了。。

    1037 在霍格沃茨找零钱

    这题也算了,有点类似时间的转换。

    1038 统计同成绩学生

    本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。

    输入格式:
    输入在第 1 行给出不超过 10^5的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。

    输出格式:
    在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

    输入样例:
    10
    60 75 90 55 75 99 82 90 75 50
    3 75 90 88

    输出样例:
    3 2 0

    这道题要说一下,关于数组统一初始化的问题,对于整数数组,可以直接使用int a[10]={0}来将其全部初始化为0,但是若使用memset函数统一初始化为0或-1的话,需要用到#include <cstring>头文件和memset(a,0,10*sizeof(int))(顺便提及,memory.hstring.h都能对应memset,而malloc函数要用stdlib.hmalloc.h)。非0非-1的初始化,其实循环赋值也挺好的,复杂度就一个O(n)。

    #include <iostream>
    using namespace std;
    
    int main(){
        int n,k,a[100001];
        cin>>n;
        //这里是将数组初始化
        for(int i=0;i<100001;i++){
            a[i]=0;
        }
        for(int i=0;i<n;i++){
            int temp;
            cin>>temp;
            a[temp]++;
        }
        cin>>k;
        for(int i=0;i<k;i++){
            int temp;
            cin>>temp;
            cout<<a[temp];
            if(i!=k-1) cout<<" ";
        }
        return 0;
    }
    

    1039 到底买不买

    这道题简而言之就是求两串字符串中各个字符是否符合要求。
    因为字符只有[09]、[az]、[A~Z],直接开两个256的数组来统计各个字符出现的次数,遍历每个字符串,以字符为下标进行统计,出现一次就++,之后再遍历一遍,用两个变量计算满足条件与否就ok了。

    1040 有几个PAT

    这题有个坑,就是要取余%1000000007,看看柳神的讲解:链接
    就是这个坑,又耗了一段时间。。

    #include <iostream>
    using namespace std;
    
    int main(){
        string a;
        cin>>a;
        int index=-1,P=0,A=0,T=0,n=0,len=a.length();
        int *sum = new int[100001];
        for(int i=0;i<100001;i++) sum[i]=0;
        //从前往后或从后往前数其实都一样,这里是从后开始数
        for(int i=len-1;i>=0;i--){
            //先从后往前数T有多少个
            if(a[i]=='T'){
                T++;
                T=T%1000000007;
            }
            //逢A就赋值,说明它后面有N个T了
            else if(a[i]=='A'){
                A+=T;
                A=A%1000000007;
            }
            //逢P就又赋值,告诉它后面能组成M个AT了
            else if(a[i]=='P'){
                P+=A;
                P=P%1000000007;
            }
            //cout<<a[i]<<sum[i]<<endl;
        }
        cout<<P%1000000007;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:2019-08-06(甲级1题,乙级5题)

          本文链接:https://www.haomeiwen.com/subject/qsewdctx.html