CCF认证201909-4推荐系统
CCF认证201909-4推荐系统
- 题目描述
- 算法设计+题目分析
- 注意点+记录点
- 代码(0分)
- 感谢链接
题目描述
201909-4推荐系统
算法设计+题目分析
写在前面的
首先,跟看这篇blog的同学说下,本文代码为0分代码,但是,经过作者的测试,是能够过用例的,零分原因在于超时(题目要求5s,使用了5.03秒)
超时分析
1、sort函数的使用,本文在查询操作中共使用了1+1+m次,当各类的总数大于K时,对于每一类都用了排序,一次排序的复杂度约为O(nlogn)
2、vector.erase()的使用,复杂度约为O(n)
可能可以解决超时的办法
1、本文的排序是使用了vector+sort的办法,或者可以用set,应能更快的排序
2、关于erase的问题,思考了一下,由于类别+编号可以唯一确定一个商品,类别<=50,商品<=3*10^4,可以采用如下的办法舍得复杂度为O(1)
const long long mul = (long long)(1e9);
cin >> kind >> id;
long long a = kind * mul + id;
commodities.erase(um[a]);
为什么不解决
解决的话要重新建立结构,时间不划算。。。
算法设计+题目分析
分析
1、初始时,各类商品的编号和分数都一样!
2、用1、2、3分别代表三种操作
3、输出时,分数相同取类别编号小的,类别相同,取商品编号小的
4、没有选中的输出-1
5、最后一行注意不要换行
设计
1、建立一个node 结构,来存储kind,id,score
2、使用vector commodity[50]来给各类建立一个数组
几个核心点
sort的使用是核心
注意点+记录点
1. 注意每次输出时判断是否是最后一样,非最后一行的再换行(即最后一行不换行)
2. sort函数的使用
#include <algorithm>
sort(a, b, cmp)
a为数组起始地址,b为终止地址的下一个地址
3、vector的函数erase的使用
vector.erase(vector.begin()+k)
删除单个元素,即第0+k个
代码(0分)
环境
Visual C++6.0
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>using namespace std;
struct node{int kind, id, score;
};
vector<node> commodity[50];
bool cmp(node a, node b){//初级比较,返回分数大大if (a.score==b.score) return a.id<b.id;//分数一致时,返回编号小大return a.score>b.score;
}
bool cmp1(node a, node b){//按照编号从小到大排序return a.id<b.id;
}
void output(int op, int op_t, int m, vector<node> K_num, vector<int> num){//第一种简单输出,输出各类之和小于K大情况int l=0;for (int i=0; i<m; i++){//遍历各类if (num[i]==0){//如果没有推荐的商品int z=-1;if (op_t==op && i==m-1) cout<<z;//最后一行,不要换行else cout<<z<<endl;continue;}sort(K_num.begin()+l, K_num.begin()+l+num[i], cmp1);//按类排序int j=l;for (l; j<l+num[i]-1; j++){cout<<K_num[j].id<<" ";}if (op_t==op && i==m-1) cout<<K_num[l+num[i]-1].id;//最后一行,不要换行else cout<<K_num[l+num[i]-1].id<<endl;l+=num[i];}
}
bool cmp3(node a, node b){//在各类之和大于K的时候,实现题目中的排序要求if (a.score==b.score && a.kind==b.kind) return a.id<b.id;if (a.score==b.score && a.id==b.id) return a.kind<b.kind;return a.score>b.score;}
void output2(int op, int op_t, int m, int total, vector<node> K_num){//各类之和大于K的时候的输出sort(K_num.begin(), K_num.end(), cmp3);//利用第三种分类对所有推荐的进行排序vector<node> temp[50];for(int i=0; i<total; i++){//按照类别放入相应的temp[i]temp[K_num[i].kind].push_back(K_num[i]);}for(int j=0; j<m; j++){//遍历各类if (temp[j].size()==0){int z=-1;if (op_t==op && j==m-1) cout<<z;//最后一行,不要换行else cout<<z<<endl;continue;}sort(temp[j].begin(), temp[j].end(), cmp1);类内排序for(int k=0; k<temp[j].size()-1; k++){cout<<temp[j][k].id<<" ";}if (op_t==op && j==m-1) cout<<"last"<<temp[j][temp[j].size()-1].id;//最后一行,不换行else cout<<temp[j][temp[j].size()-1].id<<endl;}}
int main(){freopen("C:\\input.txt", "r", stdin);int m, n;cin>>m>>n;int id, score, op_num;for (int i=0; i<n; i++){//遍历每个商品cin>>id>>score;node product;product.id=id;product.score=score;for (int j=0; j<m; j++){//遍历各类product.kind=j;commodity[j].push_back(product);}}cin>>op_num;int c;int kind;for (int ii=0; ii<op_num; ii++){cin>>c;if (c==1){//增加商品cin>>kind>>id>>score;node product_c;product_c.kind=kind;product_c.id=id;product_c.score=score;commodity[kind].push_back(product_c);}if (c==2){//删除商品cin>>kind>>id;int k=0;for(; k<commodity[kind].size(); k++) {if(commodity[kind][k].id == id) break;}commodity[kind].erase(commodity[kind].begin()+k);}if (c==3){int total, num_t;cin>>total;vector<node> K_num;vector<int> num;for(int iii=0; iii<m; iii++){cin>>num_t;sort(commodity[iii].begin(), commodity[iii].end(), cmp);//类内排序for (int jj=0; jj<num_t && jj<commodity[iii].size(); jj++){K_num.push_back(commodity[iii][jj]);//选出各类前面k_i个商品}if (num_t>commodity[iii].size()) num.push_back(commodity[iii].size());//确定每类选出的商品数量else num.push_back(num_t);}if (total>=K_num.size()) output(op_num, ii+1, m, K_num, num);//在给类中挑选最大的num个if (total<K_num.size()) output2(op_num, ii+1, m, total, K_num);//一起挑选K个(total)}}return 0;
}
感谢链接
无
CCF认证201909-4推荐系统相关推荐
- CCF认证历年试题解【网上跟帖,请不要使用称呼】
程序改变现实,软件统治世界. 程序员需要有精益求精的工匠精神,追求逻辑的极简.时间的最少和存储的最省,并且懂得其中的平衡. 数据表示需要优先考虑,对于许多问题,找到表示该问题的数据结构,问题自然就解决 ...
- ccf认证俄罗斯方块java_CCF认证历年试题 - osc_h3robkrt的个人空间 - OSCHINA - 中文开源技术交流社区...
CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201703-1 分蛋糕(100分) CCF201612-1 中间数(100分) CCF2 ...
- CCF认证训练行动路线图
通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...
- CCF认证历年试题集
来源:CCF计算机职业资格网站. CCF201703试题 CCF201612试题 CCF201609试题 CCF201604试题 CCF201512试题 CCF201509试题 CCF201503试题 ...
- CCF认证201403-1相反数
CCF认证201403-1相反数 题目描述 算法设计+题目分析 注意点+记录点 代码(100分) 感谢链接 题目描述 CCF认证201403-1相反数 算法设计+题目分析 分析题目: 因为题目给的数各 ...
- CCF认证2019031-小中大
本人初学,水平有限,若有不足,恳请赐教! 这应该是CCF认证有史以来最复杂的第一题了.首先中位数的概念同中学数学概念.数据为奇数个时为最中间的数,否则为最中间的两个数的算数平均数.不过还要注意的是在第 ...
- CCF认证 201712-4 行车路线(100分)
CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...
- ccf试题及答案java,ccf认证考试试题答案
ccf认证考试试题答案 CCF,中国计算机学会,英文全称为China Computer Federation,简称CCF,成立于1962年,是中国计算机科学与技术领域群众性学术团体,属一级学会,独立法 ...
- ccfcsp题库c语言,2019年CCF认证第一轮CSP-S信息学C++试题答案A卷
原标题:2019年CCF认证第一轮CSP-S信息学C++试题答案A卷 CSP-J/S是CCF创办的CSP(软件能力认证)中面向非专业级的软件能力认证,于今年首次开设,分为CSP-J(入门级,Junio ...
最新文章
- nuget.org 发布自己的程序包
- 论c++/java/c 与python的语法上的区别
- 小而美的个人博客——后端——管理页面
- 图像变清晰 图像放大 提高分辨率 提高清晰度
- 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战
- gitlab备份与还原:配置文件解读、定时备份、云备份
- 关于ngx_trylock_accept_mutex的一些解释
- MySQL Incorrect string value: 有可能是字符串长度不够了
- cocos2dx setVisible 与setEnabled 小实例
- ‘ssh-keygen‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- idea全局主题_IntelliJ IDEA好看的主题设置(支持自定义)
- python 贪吃蛇
- pdfFactory Pro 不能被安装(AddPrinterDriver 失败)...找不到指定的模块
- 前端面试(面试官篇)
- 计算机会计电算化与实训报告,会计电算化实训总结报告
- 如何压缩PDF文件、图片转PDF、PDF合并拆分!!!!
- 边缘计算(Edge computing) 简单介绍
- JeecgBoot 框架中实现路由跳转页面,其他页面接收参数等使用方法
- Launcher3 安装App加载显示过程分析,androidstudio开发app实例
- 第八章 可扩展标记语言XML
热门文章
- 人生只有走出来的美丽,没有等出来的辉煌! 江阴职业技术学院
- Windows 休眠文件大小设置,就这么用到了
- Ubuntu 18.04 NVIDIA驱动安装总结
- 高等数学期末总复习 DAY 3.利用导数定义求极限 判断连续与可导的关系 关于导数定义的证明题 基本求导 基本高阶求导 抽象函数求导
- 当 Erda 遇上 API 生命周期管理,好戏开始了!
- Linux环境aspose插件word转pdf中文乱码解决方案
- win10 家庭版 hyper-v监控程序启动失败
- android 调用go静态库,CGO,GOLANG调用C库,调用代码、静态库或动态库
- requests库和beautifulsoup爬取豆瓣书本数据并存入excel
- 网络计算机可访问但不能显示网络打印机,电脑、打印机共享看不到自己的电脑,但能在网络里看到其他电脑、打印机。...