最大值最小化
2016-05-11 15:53
239 查看
#include<iostream> #include<vector> using namespace std; //最大值最小化:对于一个给定正整数序列如1 2 3 2 5 4,将其划分3组, //求解其中使得3个组内的和的最大值最小的划分,其最优划分为1 2 3|2 5|4 //结果为7 bool fun(vector<int>&num,int m,int grp) //划分的结果值可以小于m { int s = 0; int i = 0; int gnum = 0; //当前已划分的组数 if (num.size() < grp) //要划分的组数大于当前数据的数目 return false; while (i < num.size()) { if (s == 0 && num[i] > m) //数据中有单个数据比m大 return false; if (s + num[i] <= m) //尽可能多让从当前数据开始的分组内包含更多的数据 { s = s + num[i]; i++; } else { gnum++; s = 0; } } gnum++; //这里添加最后一个划分的组 if (gnum > grp) //要达到当前的m需要划分的最小组数大于指定组数 return false; return true; } int main() { vector<int> data = { 1, 2, 3, 2, 5 }; //待划分的数据 int group = 3; //划分的组数 int min = data[0]; //可能得到的最小结果 int max = 0; //划分的最大结果 for (int i = 0; i < data.size(); i++) max = max + data[i]; while (min < max) { int mid = (min + max) / 2; if (fun(data, mid, group)) //最小值可以达到mid,则结果在[min,mid]之间,否则在[mid+1,max]之间 max = mid; else min = mid+1; } cout << min << endl; //得到结果后,如果想输出划分,则可之间调用fun(data,min,group)自行划分 return 0; }
相关文章推荐
- next_permutation函数 in c++
- LightOJ 1287
- 深入理解C++中的vector类的用法及特性
- OpenGL ES Shader相关API 总结【4】—— GLSL 语法小结【持续更新】
- 设计模式——抽象工厂模式
- 第10、11周 项目1 点-圆-圆柱的继承设计 (2)
- unity 手指移动物体旋转两个手指控制物体大小缩放
- 当spring报close不能手动控制和rollback不能手动控制
- c++分离式编译模型
- 操作系统——存储管理
- Uva 674
- 深入理解Java虚拟机学习总结(二) 垃圾收集器与内存分配策略
- extern、 const、static的理解
- -- 毛玻璃效果
- TI CC2541 BLE协议栈蓝牙MAC 地址
- native2ascii 国际资源文件编码
- C++遍历文件夹获取文件列表
- 柴俊理金:5月11日现货黄金、宁贵沥青操作策略
- MySQL 去掉字段中的换行和回车符
- javascript复习第二天删除元素节点