N进制算法
来源:互联网 发布:手机淘宝充值中心 编辑:程序博客网 时间:2024/05/21 17:31
N进制问题其实可以理解为有一定数量的金币(X个)放在N+1个柱子上的问题。有很多应用场景。
至少目前遇见的有两处:第一:游戏中玩家数据统计时,有很多维度,如等级、VIP等级、是否参与某活动、在此活动中升到的等级等等。之前项目中有五个维度,示例代码:
class DataSortKey{public: DataSortKey(){ memset(this, 0, sizeof(*this)); } unsigned level; unsigned vip_level; unsigned param1; uint64_t param2; unsigned param3;};bool operator<(const DataSortKey& lhs, const DataSortKey& rhs);第二:在N个数中取0~X个(0<X<N)之和,设一定的上限,可以重复取,求可以取到的所有组合。示例代码:
class CoinOnColumn{public:CoinOnColumn(int coin_count, int column_count){this->coin_count = coin_count;// 加上了一个空柱子 0-column_count其实是column_count+1个柱子this->column_count = column_count;coin_column_idxs.resize(coin_count, 0);}void Add(){////已是最大//if (IsMax())//{//return;//}for (int nIdx = 0; nIdx < coin_count; ++nIdx){if (coin_column_idxs[nIdx] == column_count){continue;}else{++coin_column_idxs[nIdx];for (int j = 0; j < nIdx; ++j){coin_column_idxs[j] = 0;}return;}}++coin_column_idxs[coin_count - 1];for (int j = 0; j < coin_count - 1; ++j){coin_column_idxs[j] = 0;}}std::vector<int> coin_column_idxs;// 硬币数量int coin_count;// 柱子数量,包括添加的0号柱子,硬币在0号柱子上表示不算int column_count;bool IsMax(){for (int nIdx = 0; nIdx < coin_count; ++nIdx){if (coin_column_idxs[nIdx] != column_count){return false;}}return true;}};使用:
void GetNumber2(int data[], int nDataCount, int nElementMax, int nElementCount, std::vector<int>& vecRet){CoinOnColumn coc(nElementCount, nDataCount);while (!coc.IsMax()){coc.Add();int result = 0;for (int nIdx = 0; nIdx < nElementCount && result <= nElementMax; ++nIdx){//金币在0号柱子上表示没有意义,不用加if (coc.coin_column_idxs[nIdx] > 0){result += data[coc.coin_column_idxs[nIdx] - 1];}}if (result <= nElementMax){vecRet[result] = 1;}}}main中使用:
int data[17] ={ 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 75, 80, 100, 150, 200, 250};int data_size = sizeof(data) / sizeof(data[0]);ofstream ofs("numbers.txt", std::ios::app);for (int i = 1; i < 10; ++i){std::vector<int> vecRet;vecRet.resize(250 + 1);GetNumber2(data, data_size, 250, i, vecRet);//std::sort(vecRet.begin(), vecRet.end());for (int nIdx = 1; nIdx < vecRet.size(); ++nIdx){if (vecRet[nIdx] == 1){ofs << nIdx << " ";}}ofs << endl;}ofs.flush();ofs.close();其逻辑抽象其实就是一个N进制的问题。这里简记一下,备忘。
注意这里第二个问题是第一个问题的特化。第一个问题中,每个数据的维度可以分别有一个上限,也可以分别有一个起始值,还可以分别有一个步长。比如“统计所有玩家在等级/VIP等级上的分布,每5级一档,每2个VIP等级一档”,这时候等级被划定为1-5/6-10/11-15/16-20......VIP等级被划定为0-1/2-3/4-5/6-7,等级起始值为1,终止值为最高等级(比如100级就是100),步长为5。VIP起始值为0,终止值为VIP最高等级(如15),步长为2。
阅读全文
0 0
- N进制算法
- php版本 N进制算法
- n皇后2进制算法
- 数的进制转换算法-m进制到n进制
- 计算n位m进制所有整数的算法
- n*n基础排序算法
- floyd 算法(o(n*n*n)
- m进制转换为n进制-任意进制转换算法
- m进制转换为n进制-任意进制转换算法
- m进制转换为n进制-任意进制转换算法
- m进制转换为n进制-任意进制转换算法
- 高效率的全排列算法——N进制方法实现
- 十六进制快速转换八进制(算法核心可适用于2^n进制转化)
- m选n算法
- N个皇后算法
- N皇后问题算法
- N皇后算法
- 交集N算法
- FPGA基础实验:多周期移位寄存器
- RxJava源码分析(二)
- 基于MFC的多线程编程实例AfxMessageBegin
- 第3章 安装windows与Linux双系统
- 树的高度
- N进制算法
- RFCN-阅读笔记-理解
- hpuoj【1452】你家的狗有病吧【思维】
- 利用GMP大整数库,实现ElGamal加解密
- centos6.8下mosquitto简介及搭建
- MathJax编辑指南
- 稳压电源 连载18:附录2 参数测量与特性图示
- rsync通过服务同步(下)
- angular jQuery css html混合table表格查询 排序 添加 删除 隔行换色