shopee的零食柜

题目描述

  shopee的零食柜,有着各式各样的零食,但是因为贪吃,小虾同学体重日益增加,终于被人叫为小胖了,他终于下定决心减肥了,他决定每天晚上去操场跑两圈,但是跑步太累人了,他想转移注意力,忘记痛苦,正在听着音乐的他,突然有个想法,他想跟着音乐的节奏来跑步,音乐有7种音符,对应的是1到7,那么他对应的步长就可以是1-7分米,这样的话他就可以转移注意力了,但是他想保持自己跑步的速度,在规定时间m分钟跑完。为了避免被累死,他需要规划他每分钟需要跑过的音符,这些音符的步长总和要尽量小。下面是小虾同学听的歌曲的音符,以及规定的时间,你能告诉他每分钟他应该跑多少步长?

输入描述

  输入的第一行输入 n(1 ≤ n ≤ 1000000,表示音符数),m(1<=m< 1000000, m <= n)组成,第二行有 n 个数,表示每个音符(1<= f <= 7)。

输出描述

输出每分钟应该跑的步长。

解题思路

  这道题其实是相当于在N个数间插入M-1个棍,将其分为M组,分组的和的最大值就是这一种分法的步长,求所有分法中步长最小的那一种。
  暴力搜索的方法想当于在N-1个位置上挑出M-1个位置进行全排列,这样时间复杂度会很高,尝试过深度搜索之后果然超时。
  换一个角度;将这N个数分为M组,所有组的和是数据的总和,分组越多,每一组的大小越小,步长越小,分组越少,每一组的大小越大,步长越大,最小的步长是所有数据中的最大值(分组为N),最大的步长是所有数的总和(分组为1),那么题目就是寻找满足分成M组的最小步长,有了上下界,就可以进行二分搜索。

实现代码

#include <iostream>
#include <vector>
using namespace std;
class Solution{
	public:
	int getMin(vector<int>& data,int n,int m){
		int sum=0;
		for(int i=0;i<n;i++)
			sum+=data[i];	
		int low=sum/m,high=sum,mid;
		while(low<high){
			mid=(low+high)/2;
			int cnt=0,i=0,tmp;
			while(i<n){
				tmp=0;
				while(i<n&&tmp+data[i]<=mid){
					tmp+=data[i];
					i++;
				}
				cnt++;
			}
			if(cnt<=m) high=mid;
			else  low=mid+1;		
		}
		return low;
	}
};
int main(){
	int n,m;
	cin>>n>>m;
	vector<int> data(n,0);
	for(int i=0;i<n;i++)
		cin>>data[i];
	Solution s;
	cout<<s.getMin(data,n,m)<<endl;
}

  二分搜索有两种可能的结果,一种是分为M组的最小步长,刚好就是解,还有一种是由于当遍历到这个结果之后,二分法还没有结束(low和high之间还有距离),这个时候再向下进行,找到的可能就是大于M组的步长,所以我保持了一个分为M组的时候的记录minv,但是测试结果没有直接cout<<mid<<endl的好,我怀疑这是测试用例的问题,或者是我有所疏漏,欢迎大家指教。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答:在你提供的引用中,有关于DFS算法和网络请求的代码。首先,引用中的代码是一个DFS算法的实现,用于计算从起点到终点的路径数量。它使用了一个二维数组来表示地图,其中1表示起点,2表示终点,0表示障碍物。通过递归调用DFS函数,可以计算出路径数量。中的代码是一个网络请求的示***并获取了返回的JSON数据。然后,它从数据中提取出所需的信息并进行打印。中的代码是对DFS算法的改进版本,它将无法到达的点也纳入了计算范围。具体来说,它使用了一个二维数组来表示地图,其中1表示起点,0表示障碍物。通过遍历数组,将可以到达的点标记为1,无法到达的点标记为0。最终,它可以计算出从起点到终点的路径数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【牛客-Shopee 2019校招部分编程题汇总】[编程题]Shopee的办公室(二)dp(python3)](https://blog.csdn.net/anan15151529/article/details/118110977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【电商系列】shopee的数据获取](https://blog.csdn.net/CorGi_8456/article/details/124338631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值