最大值最小化问题

来源:互联网 发布:刷脸解锁软件 编辑:程序博客网 时间:2024/06/08 07:32

问题描述可参考最大值最小化问题,问题在刘汝佳老师的算法竞赛入门经典书上的p151页,核心算法是二分法猜最大值,猜对了继续小化,猜错了增大数字,初始左值为序列第一个元素值,右值为序列和。

猜对:就是从右向左近尽量在满足<=x(x为猜测值)的条件下划分数组元素到一个子序列,同时要保证有给定的序列数(每个序列至少一个元素)

下面是我的C++实现代码

#include<iostream>using namespace std;#define N 1000000int a[N];int search_min(int n,int k){int sum=0;for (int i = 0; i < n; i++)sum += a[i];int x = a[0], y = sum;while (1){int s = 0, sum = a[0], i;int mid = x + (y - x) / 2,max,flag = 0;for (i = 1; i < n; i++){if (sum <= mid&&sum + a[i] > mid){if (!flag){ flag = 1; max = sum; }if (sum>max) max = sum;sum = a[i]; s++;}else                               { sum += a[i]; }}if (s <= k - 1){if (sum > max) max = sum; y = max;//通过y来获取并优化解。}else if(x!=mid)       x = mid ;else break;//如果发现错误答案并且和左值相同则退出查找。}return y;}int main(){int n,k;cin >> n >> k;for (int i = 0; i < n; i++)cin >> a[i];cout << search_min(n,k) << endl;//system("pause");return 0;}



                                             
0 0
原创粉丝点击