L2-039 清点代码库 (25 分) (map按照val排序,重定义比较函数)

该博客讨论了一个简化问题的解决方案,即如何检测并消除功能重复的代码模块。通过输入输出对应关系,将模块输出简化为整数,然后通过一系列输入检查,找出功能相同的功能模块。解决方案使用了map来存储输出与出现次数的关系,并通过排序输出结果。
摘要由CSDN通过智能技术生成

这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。

输入格式:

输入在第一行中给出 2 个正整数,依次为 N(≤104)和 M(≤102),对应功能模块的个数和系列测试输入的个数。

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

输出格式:

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

注:所谓数列 { A 1 , . . . , A M A_1, ..., A_M A1,...,AM} 比 { B 1 , . . . , B M B_1, ..., B_M B1,...,BM} 大,是指存在 1≤i<M,使得 A 1 = B 1 , . . . , A i = B i 成 立 , 且 A i + 1 > B i + 1 A_1=B_1,...,A_i=B_i成立,且 A_i+1>B_i+1 A1=B1,...,Ai=Bi,Ai+1>Bi+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

map排序详解

/*
A: 10min
B: 20min
C: 30min
D: 40min
*/ 
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <sstream>
#define pb push_back 
#define all(x) (x).begin(),(x).end()
#define mem(f, x) memset(f,x,sizeof(f)) 
#define fo(i,a,n) for(int i=(a);i<=(n);++i)
#define fo_(i,a,n) for(int i=(a);i<(n);++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
#define endl '\n'
using namespace std;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

template<typename T>
ostream& operator<<(ostream& os,const vector<T>&v){for(int i=0,j=0;i<v.size();i++,j++)if(j>=5){j=0;puts("");}else os<<v[i]<<" ";return os;}
template<typename T>
ostream& operator<<(ostream& os,const set<T>&v){for(auto c:v)os<<c<<" ";return os;}
template<typename T1,typename T2>
ostream& operator<<(ostream& os,const map<T1,T2>&v){for(auto c:v)os<<c.first<<" "<<c.second<<endl;return os;}
template<typename T>inline void rd(T &a) {
    char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
    while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}

typedef pair<int,int>PII;
typedef pair<long,long>PLL;

typedef long long ll;
typedef unsigned long long ull; 
const int N=1e4+10,M=1e9+7;
int n,m;

map<vector<int>,int>mp;
//疑问:如果题目要求递减顺序输出呢?vector怎么排?
bool cmp(const pair<vector<int>,int>& a,const pair<vector<int>,int>& b){
    if(a.second==b.second){ // 可以直接对vector 排序,vecotor按照递增顺序输出。
        return a.first<b.first;
    }
    return a.second>b.second;
}

void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        vector<int>t;
        for(int j=1;j<=m;j++){
            int x;cin>>x;
            t.pb(x);
        }
        mp[t]++;
    }
    
    vector<pair<vector<int>,int>>ans(mp.begin(),mp.end());
    sort(ans.begin(),ans.end(),cmp);
    cout<<ans.size()<<endl;
    
    for(auto c:ans){
        cout<<c.second<<" ";
        bool flag=0;
        for(auto d:c.first){
            if(!flag){
                cout<<d;
                flag=1;
            }
            else{
                cout<<" "<<d;    
            }
            
        }
        cout<<endl;
    }
}

int main(){
	solve();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
val_loss函数是指用于评估模型在验证集上的损失函数。在机器学习中,我们通常将数据集划为训练集和验证集,用训练集训练模型,然后用验证集验证模型的性能。val_loss函数被用来衡量模型预测结果与验证集标签之间的差异程度。 val_loss函数代码实现通常与模型训练过程中的损失函数代码实现类似。在训练过程中,模型会根据训练集的输入和标签生成预测结果,并计算与标签之间的差异,即损失值。同样地,在验证过程中,模型会根据验证集的输入生成预测结果,并计算与验证集的标签之间的差异,这就是val_loss函数的计算方式。 具体的val_loss函数代码实现可能会根据具体的机器学习框架和任务而有所不同。一般来说,val_loss函数的计算会涉及到模型的预测结果和验证集标签的对比,计算它们之间的差异,并根据差异的大小来评估模型在验证集上的性能。 val_loss函数的数值越小,表示模型在验证集上的性能越好。在训练过程中,我们通常会监控val_loss函数的数值变化,以判断模型是否出现过拟合或欠拟合的情况。如果val_loss函数的数值一直在下降,说明模型在训练过程中在验证集上的表现一直在改善。如果val_loss函数的数值开始上升,说明模型可能已经开始过拟合了,需要调整模型的复杂度或者调整其他超参数。 总之,val_loss函数是用于评估模型在验证集上的损失函数,通过计算模型预测结果与验证集标签之间的差异来评估模型在验证集上的性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值