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推荐系统相关推荐

  1. CCF认证历年试题解【网上跟帖,请不要使用称呼】

    程序改变现实,软件统治世界. 程序员需要有精益求精的工匠精神,追求逻辑的极简.时间的最少和存储的最省,并且懂得其中的平衡. 数据表示需要优先考虑,对于许多问题,找到表示该问题的数据结构,问题自然就解决 ...

  2. ccf认证俄罗斯方块java_CCF认证历年试题 - osc_h3robkrt的个人空间 - OSCHINA - 中文开源技术交流社区...

    CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201703-1 分蛋糕(100分) CCF201612-1 中间数(100分) CCF2 ...

  3. CCF认证训练行动路线图

    通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...

  4. CCF认证历年试题集

    来源:CCF计算机职业资格网站. CCF201703试题 CCF201612试题 CCF201609试题 CCF201604试题 CCF201512试题 CCF201509试题 CCF201503试题 ...

  5. CCF认证201403-1相反数

    CCF认证201403-1相反数 题目描述 算法设计+题目分析 注意点+记录点 代码(100分) 感谢链接 题目描述 CCF认证201403-1相反数 算法设计+题目分析 分析题目: 因为题目给的数各 ...

  6. CCF认证2019031-小中大

    本人初学,水平有限,若有不足,恳请赐教! 这应该是CCF认证有史以来最复杂的第一题了.首先中位数的概念同中学数学概念.数据为奇数个时为最中间的数,否则为最中间的两个数的算数平均数.不过还要注意的是在第 ...

  7. CCF认证 201712-4 行车路线(100分)

    CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...

  8. ccf试题及答案java,ccf认证考试试题答案

    ccf认证考试试题答案 CCF,中国计算机学会,英文全称为China Computer Federation,简称CCF,成立于1962年,是中国计算机科学与技术领域群众性学术团体,属一级学会,独立法 ...

  9. ccfcsp题库c语言,2019年CCF认证第一轮CSP-S信息学C++试题答案A卷

    原标题:2019年CCF认证第一轮CSP-S信息学C++试题答案A卷 CSP-J/S是CCF创办的CSP(软件能力认证)中面向非专业级的软件能力认证,于今年首次开设,分为CSP-J(入门级,Junio ...

最新文章

  1. nuget.org 发布自己的程序包
  2. 论c++/java/c 与python的语法上的区别
  3. 小而美的个人博客——后端——管理页面
  4. 图像变清晰 图像放大 提高分辨率 提高清晰度
  5. 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战
  6. gitlab备份与还原:配置文件解读、定时备份、云备份
  7. 关于ngx_trylock_accept_mutex的一些解释
  8. MySQL Incorrect string value: 有可能是字符串长度不够了
  9. cocos2dx setVisible 与setEnabled 小实例
  10. ‘ssh-keygen‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  11. idea全局主题_IntelliJ IDEA好看的主题设置(支持自定义)
  12. python 贪吃蛇
  13. pdfFactory Pro 不能被安装(AddPrinterDriver 失败)...找不到指定的模块
  14. 前端面试(面试官篇)
  15. 计算机会计电算化与实训报告,会计电算化实训总结报告
  16. 如何压缩PDF文件、图片转PDF、PDF合并拆分!!!!
  17. 边缘计算(Edge computing) 简单介绍
  18. JeecgBoot 框架中实现路由跳转页面,其他页面接收参数等使用方法
  19. Launcher3 安装App加载显示过程分析,androidstudio开发app实例
  20. 第八章 可扩展标记语言XML

热门文章

  1. 人生只有走出来的美丽,没有等出来的辉煌! 江阴职业技术学院
  2. Windows 休眠文件大小设置,就这么用到了
  3. Ubuntu 18.04 NVIDIA驱动安装总结
  4. 高等数学期末总复习 DAY 3.利用导数定义求极限 判断连续与可导的关系 关于导数定义的证明题 基本求导 基本高阶求导 抽象函数求导
  5. 当 Erda 遇上 API 生命周期管理,好戏开始了!
  6. Linux环境aspose插件word转pdf中文乱码解决方案
  7. win10 家庭版 hyper-v监控程序启动失败
  8. android 调用go静态库,CGO,GOLANG调用C库,调用代码、静态库或动态库
  9. requests库和beautifulsoup爬取豆瓣书本数据并存入excel
  10. 网络计算机可访问但不能显示网络打印机,电脑、打印机共享看不到自己的电脑,但能在网络里看到其他电脑、打印机。...