2 条题解

  • 5
    @ 2023-10-5 18:41:16

    最初的想法:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct number{
        long long num;
        int times;
    } n[10000];
    
    bool cmp(number a, number b){
        return a.num<b.num;
    }
    
    int main(){
        int m, ni=0;
        scanf("%d", &m);
    
        for(int i=0; i<m; i++){
            long long t;
            scanf("%lld", &t);
    
            bool flag=1;
            for(int j=0; j<=ni; j++){
                if(n[j].num == t){
                    n[j].times++;
                    flag = 0;
    
                    break;
                }
            }
    
            if(flag){
                n[ni].num = t;
                n[ni].times++;
                ni++;
            }
        }
    
        sort(n, n+ni, cmp);
    
        for(int i=0; i<ni; i++){
            printf("%lld %d\n", n[i].num, n[i].times);
        }
        
        return 0;
    }
    

    结果:

    70 Time Exceeded

    o(╥﹏╥)o

    然后,,问了下《文心一言》(由于某些原因,超链接已被删除。。)

    给出的代码和我上面的类似,但是使用了两种………………(难以形容)的数据结构:map、vector

    二者的功能大致如下(你猜484我自己写的??【100%不是!!!】):

    • mapvector都是C++标准模板库(STL)中的容器,它们分别提供了不同的功能和特性。
    • vector是一个动态数组,支持随机访问、插入、删除和查找等操作。它在内存中以连续的方式存储元素,这意味着可以通过索引直接访问任何元素。vector在需要更多空间时会自动扩展其容量,通常是按指数方式增长。vector提供了高效的随机访问操作,但插入和删除操作可能会导致元素移动,因此在某些情况下可能效率较低。
    • map是一个关联容器,以键值对的形式存储元素。每个元素都由一个键和一个值组成,键在map中是唯一的。map按照键的顺序进行排序,并提供快速的查找操作。它底层通常实现为红黑树,这是一种自平衡的二叉搜索树,能够在插入、删除和查找操作中保持对数时间复杂度。map适用于需要根据键快速查找或操作对应值的情况。
    • 以下是vectormap的定义示例:
    #include <vector>  
    #include <map>  
    
    // 定义一个vector<int>,存储整数  
    std::vector<int> vec;  
    
    // 定义一个map<string, int>,键为字符串,值为整数  
    std::map<std::string, int> map;
    
    • 总的来说,vector适用于需要随机访问和动态扩展数组的情况,而map适用于需要根据键快速查找或操作对应值的情况。

    修改后的代码:

    #include<cstdio>
    #include<map>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    map<int, int> x;  //存储数字出现次数
    vector<pair<int, int>> n;  //排序需要
    
    int main(){
        int m;
        scanf("%d", &m);
    
        for(int i=0; i<m; i++){
            int t;
            scanf("%d", &t);
    
            x[t]++;  //x 中键为 t 的值 自增 1
        }
    
        for(auto i=x.begin(); i!=x.end(); i++){
            n.push_back(*i);  //将 map 的数据转存入 vector 中 
        }
        /* 文心一言给出的代码为:
        for(auto& p : x){  
            n.push_back(p);  //将 map 的数据转存入 vector 中  
        } 
        P.S. 2022 CSP-j 第一轮的噩梦。。
        */
        
        sort(n.begin(), n.end());  //按照从小到大的顺序进行排序
    
        for(auto i=n.begin(); i!=n.end(); i++){
            printf("%d %d\n", i->first, i->second);  //输出 排序后的值(->first、->second 分别对应pair两项)
        }
        /* 文心一言给出的代码为:
        for(auto& p : n){  
            printf("%d %d\n", p.first, p.second);  
        }  
        */
        
        return 0;
    }
    

    100 Accepted

    • 2
      @ 2023-10-6 9:41:39

      我这代码是怎么把数据水过去的???

      #include <bits/stdc++.h>
      using namespace std;
      long long a[1000000],n,num=1;
      int main()
      {
          scanf("%lld",&n);
          for(int i=1;i<=n;i++)
              scanf("%lld",&a[i]);
          sort(a+1,a+n+1);
          cout<<a[1]<<" ";
          for(int i=2;i<=n;i++)
          {
              if(a[i]!=a[i-1])
              {
                  cout<<num<<endl;
                  cout<<a[i]<<" ";
                  num=1;
              }
              else
                  num++;
          }
          cout<<num;
          return 0;
      }
      
    • 1

    信息

    ID
    159
    时间
    1000ms
    内存
    125MiB
    难度
    7
    标签
    递交数
    81
    已通过
    18
    上传者