POJ3273-Monthly Expense (最小化最大值)

2024-08-27 02:38

本文主要是介绍POJ3273-Monthly Expense (最小化最大值),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:click here~~

【题目大意】

 农夫JF在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值

【解题思路】:

经典的最小化最大值问题,要求连续的m个子序列,子序列的和最大值的最小,枚举满足条件的m的最小值即为答案,因此二分查找。

1.是否能把序列划分为每个序列之和不大于mid的m个子序列,
2.通过用当前的mid值能把天数分成几组,
3.比较mid和t的大小,从而确定mid

具体见代码吧:

 
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int n,m,num[N];
bool is_part(int mid)
{int t=0,s=0;     //t==当前mid值能把n天分成的组数(初始把全部天数作为0组)     bool ok=true;for(int i=0; i<n; i++)//遍历每一天的花费{if(num[i]>mid){//如果某个值大于,显然不符合ok=false;break;}if(s+num[i]>mid){//不能再把当前元素加上了t++;s=num[i];    //把前i天作为一组if(t>m-1){   //t=m时退出,即在最后一个元素之前都已经用了m条划分线ok=false;break;}}else s+=num[i];//把当前元素与前面的元素加上,以便尽量往右划分,贪心到底}return ok;
}
void judge()          //二分查找
{int ll=0,rr=1e8;while(ll<rr){int mid=(ll+rr)>>1;if(is_part(mid)) rr=mid;else ll=mid+1;}printf("%d\n",ll);
}
int main()
{int maxx=0,sum=0;scanf("%d%d",&n,&m);for(int i=0; i<n; i++){scanf("%d",&num[i]);sum+=num[i];maxx=max(maxx,num[i]);}if(m==n||m==1) printf("%d\n",maxx);else judge();return 0;
}

这篇关于POJ3273-Monthly Expense (最小化最大值)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110396

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

【hdu】I Hate It(线段树,结点修改求区间最大值)

线段树的模板题,还是二分递归。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <set>#include <map>#incl

SQL文:求最大值问题

SQL文:求最大值问题 在判定流程中的“一级审理节点”查找最新审批数据 select a.workitemid, a.workitemname, a.endtime, a.processinstid from WFWORKITEM a where a.workitemid in (select max(b.workitemid) from WFWORKITEM b where b.workitem

环上k划分的和的gcd的最大值【gcd基本性质的利用】

今早看到的题,想了下会做了,但是觉得这题挺有意思的,于是打算写一下做法。本题利用了gcd的基本性质:更相减损法以及结合律,平时做gcd的题基本没用到过这两性质,而本题对这性质进行了充分利用。 思路: 首先我们考虑给一个序列,我们该怎么做。 令 fn=∑ni=1ai f_n=\sum_{i=1}^n a_i。 我们考虑序列的一个 k+1 k+1划分 fx1,fx2−fx1,fx3−fx2

LeetCode 热题100-11 滑动窗口的最大值

滑动窗口的最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值-

MYSQL:删除指定时间范围内每个电站每天发电数据除最大值以外的记录

有一个需求,需要保留每个电站每一天发电数据的最大值记录,其余删除。 表数据大概长这样: MYSQL 5.7写法:(因为不支持ROW_NUMBER()函数,采用自定义的变量来代替) 首次清理一年内数据:INTERVAL 365 DAY清理前一日数据:INTERVAL 1 DAY----------------- DELETE A FROM power_app_data_log

RDP最小化之后仍然保持UI渲染的方法

RDP最小化之后仍然保持UI渲染的方法 1、运行regedit 2、找到注册表项HKEY_CURRENT_USER\Software\Microsoft\TerminalServer Client 3、新建一个类型为DWORD的注册表项RemoteDesktop_SuppressWhenMinimized并设置值为2 4、然后找到注册表项HKEY_CURRENT_USER\Soft

leetcode 239: 滑动窗口最大值

并没有完成线性时间复杂度解决问题,最坏情况下的时间复杂度为O(n*k) std::vector<int> maxSlidingWindow(std::vector<int>& nums, int k) {std::vector<int> a;if(nums.size()==0||k==0)return a;int max=nums[0];for(int i=i+1;i<k;i++){if(m

NumPy(五):数组统计【平均值:mean()、最大值:max()、最小值:min()、标准差:std()、方差:var()、中位数:median()】【axis=0:按列运算;axis=0:按列】

统计运算 np.max()np.min()np.median()np.mean()np.std()np.var()np.argmax(axis=) — 最大元素对应的下标np.argmin(axis=) — 最小元素对应的下标 NumPy提供了一个N维数组类型ndarray,它描述了 相同类型 的“items”的集合。(NumPy provides an N-dimensional array