c++天梯赛L2-039 清点代码库 (25 分)天梯赛c++附详细注释

没有题目没有附上题目,但是有输出入输出格式要求
输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤10
​4)和 M(≤102),对应功能模块的个数和系列测试输入的个数。

随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。

输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。

注:所谓数列 {
    
     A​1, ..., AM}{
    
     B1, ...,B​M
​​  } 大,是指存在 1≤i<M,使得 A1=B​1...,Ai=Bi成立,且 Ai+1>B​i+1​​ 。

输入样例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
输出样例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35

本题用到的STL容器
1map 2mutimap允许有相同的键 3vector变长数组

#include<bits/stdc++.h>
using namespace std;
//map其实有点像一个数组,不过就是数组的下标可以多样化
int main(){
    
    
    ios::sync_with_stdio(false);
    cout.tie(0);//让cin,cout和scanfprintf一样快的操作
    int m,n,t;
    cin>>m>>n;
    map<vector<int>, int> mp;//因为键不可以改变,所以用这种,让其对应的值来统计个数
    multimap<int, vector<int>> mp2;//因为输出是按个数的排列,所以键值反过来存放
    for(int i=0;i<m;i++)//用multi是因为,map反过来时把我的键值为一的吃掉了一个
    {
    
       vector<int> vi;
        vi.clear();
        for(int d=0;d<n;d++)
        {
    
     cin>>t;
          vi.push_back(t);}
     if(mp.find(vi)==mp.end())
         mp[vi]=1;
      else mp[vi]++;     }
    cout<<mp.size()<<endl;//神奇的事情,刚刚用printf居然4输出跑到后面去了,明明在代码前面
    for(auto i:mp)//难道是因为取消了同步机制吗?
    mp2.insert(make_pair(-i.second,i.first));//不加“-”的话,就是按键值的递增序列排列的
    for(auto i:mp2)//键的排列若是键的相反数就对了,所以下面还要加个“-”
    {
    
       cout<<-i.first;
       for(auto l:i.second)
           cout<<" "<<l;    
        cout<<endl;}
     return 0;
}
//map以键,从小到大的顺序排列

Guess you like

Origin blog.csdn.net/qq_51976555/article/details/117850554