4.18刚比完了中国高校计算机大赛-团体程序设计天梯赛,本蒟蒻第一次参加GPLT,差9分二等,啊啊啊我好菜(QAQ),应该再摸一题L3的
然后接下来有时间的话挑几题发发思路和代码
【问题描述】
首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 i n t int int范围内)。
于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。
【输入格式】
输入在第一行中给出 2 2 2个正整数,依次为 N N N和 M M M,对应功能模块的个数和系列测试输入的个数。
随后 N N N行,每行给出一个功能模块的 M M M个对应输出,数字间以空格分隔。
【输出格式】
首先在第一行输出不同功能的个数 K K K。
随后K行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以1个空格分隔,行首尾不得有多余空格。
输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。
注:所谓数列 A 1 , … , A M {A_1,\dots ,A_M} A1,…,AM比 B 1 , … , B M {B_1,\dots ,B_M} B1,…,BM大,是指存在 1 ≤ i < M 1≤i<M 1≤i<M,使得 A 1 = B 1 , … , A i = B i A_1=B_1,\dots ,A_i=B_i A1=B1,…,Ai=Bi成立,且 A i + 1 > B i + 1 A_{i+1}>B_{i+1} Ai+1>Bi+1。
【数据范围】
1 ≤ N ≤ 1 0 4 1≤N≤10^4 1≤N≤104
1 ≤ M ≤ 100 1≤M≤100 1≤M≤100
【输入样例】
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
【分析】
本题考查的就是 S T L STL STL的使用,对于输入的每组数据,将其存入vector
后映射至map
上,统计其出现的次数,此时map
已按vector
的字典序排好序了。然后将map
中的每对元素以pair
形式存入vector
中,将每组数据出现次数放在first
上,由于sort
是按pair
的first
进行从小到大排序的,因此存入时需在次数前加负号。然后将sort
后的结果输出就行
注:不可用sort(ans.begin(), ans.end(), greater<pair<int, vector<int> > >());
否则会打乱map中vector的顺序
【代码】
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
const int N = 10010, M = 110;
map<vector<int>, int> cnt;
vector<pair<int, vector<int> > > ans;
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
vector<int> temp;
for (int j = 0; j < m; j++)
{
int x;
scanf("%d", &x);
temp.push_back(x);
}
cnt[temp]++;
}
for (auto &u : cnt) ans.push_back({
-u.second, u.first });
//for (auto &[u, v] : cnt) ans.push_back({ -v, u });//C++新特性,PTA不支持
sort(ans.begin(), ans.end());
printf("%d\n", cnt.size());
for (auto &u : ans)
{
printf("%d", -u.first);
for (auto &v : u.second)
printf(" %d", v);
puts("");
}
return 0;
}