Leetcode 5281. 使结果不超过阈值的最小除数
又一次参赛,除了第一道Easy题和第二道Medium外,剩下的两道在有限时间内,要么没思路,要么思路不对,超时,要么有思路调试出错,还需多加练习!
(这次的第三题,在循环从1开始,直到找到满足地为止,早就预料到会超时,提交之后果然Time out,切换思路,二分查找,但是有限时间内,没有调试正确!这里做一下笔记,以便学习和提高!)

实际代码记录:
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <math.h> using namespace std;
void init(vector<vector<int> > &vc,int m,int n)
{
vector<int> level;
level.resize(n);
vc.resize(m,level);
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
cin >> vc[i][j];
}
}
} void printvc(const vector<vector<int> > vc) {
for (int i = ; i < vc.size(); i++)
{
for (int j = ; j < vc[].size(); j++)
{
cout << vc[i][j] << " ";
}
cout << endl;
}
} int subtractProductAndSum(int n) {
if (n < ) return ;
int he = , ji = ;
int temp;
temp = n % ;
while (n) {
he += temp;
ji *= temp;
n = n / ;
temp = n % ;
}
cout << "he is " << he << endl;
cout << "ji is " << ji << endl;
return ji - he;
} vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
vector<vector<int>> res;
vector<int> level;
vector<int> a;
a.resize(groupSizes.size(),);
int count = ;
while(count<groupSizes.size()){
for (int i = ; i < groupSizes.size(); i++)
{
if (a[i] == ) //可用
{
level.push_back(i);
a[i] = ;
count++;
if (level.size() != groupSizes[i])
{
for (int j = i + ; j < groupSizes.size(); j++)
{
if (groupSizes[j] == groupSizes[i] && a[j] == ) {
level.push_back(j);
a[j] = ;
count++;
if (level.size() == groupSizes[i])
break;
}
}
} res.push_back(level);
level.clear();
break;
}
}
} return res;
} bool isornot(vector<int> nums, int number, int threshold);
int smallestDivisor(vector<int>& nums, int threshold) {
//先排序
sort(nums.begin(), nums.end());
//然后二分查找一个满足的值
int low = ;
int high = nums[nums.size() - ];
int res=nums[];
int mid;
while (low <= high) {
mid = (low + high) / ;
if (!isornot(nums, mid, threshold)) //如果mid不符合,说明,答案在右半个区间,更新low
low = mid + ;
else //否则,在左半个区间,更新high
{
high = mid - ;
res = mid;
}
}
return res;
} bool isornot(vector<int> nums,int number, int threshold) {
int sum = ;
for (int i = ; i < nums.size(); i++)
{
sum += ceil(nums[i] / (number*1.0));
//cout<< number<<" sum is "<<sum<<endl;
if (sum > threshold)
return false;
}
return true;
}
int main()
{
// vector<vector<int> > vc;
//init(vc,3,4);
//printvc(vc); /* 第一题
int n;
cin >> n;
cout << subtractProductAndSum(n) << endl;
return 0;
*/ /* 第二题
vector<int> a;
int n;
cin >> n;
a.resize(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
vector<vector<int>> res;
res = groupThePeople(a);
for (int j = 0; j < res.size(); j++)
{
for (int k = 0; k < res[j].size(); k++)
{
cout << res[j][k] << " ";
}
cout << endl;
}
return 0;
*/ /*
vector<int> a;
int n;
cin >> n;
int threshold;
cin >> threshold;
a.resize(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int res = smallestDivisor(a,threshold);
cout << res << endl; return 0;
*/ return ;
}
第166周赛题目列表:

分析:
第一题很简单,直接提出数字n的每一位,进行求和和求积,然后返回差即可!
第二题是说,每个人站在一个确定人数的分组里,那么,加入这个人在3个人的组group里,group.size()就等于每个人身上的号码。
第三题,就是一开始遍历所有值,但是超时,然后采用二分搜索的方式进行求解:
题目三:
给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。
请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。
每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。
题目保证一定有解。
示例 1:
输入:nums = [1,2,5,9], threshold = 6
输出:5
解释:如果除数为 1 ,我们可以得到和为 17 (1+2+5+9)。
如果除数为 4 ,我们可以得到和为 7 (1+1+2+3) 。如果除数为 5 ,和为 5 (1+1+1+2)。
首先写一个函数,判断一个数是否满足数组nums和阈值threshold,
bool isornot(vector<int> nums,int number, int threshold) {
int sum = ;
for (int i = ; i < nums.size(); i++)
{
sum += ceil(nums[i] / (number*1.0));
//cout<< number<<" sum is "<<sum<<endl;
if (sum > threshold)
return false;
}
return true;
}
然后,数组确定,二分查找这样的最小值即可;
int smallestDivisor(vector<int>& nums, int threshold) {
//先排序
sort(nums.begin(), nums.end());
//然后二分查找一个满足的值
int low = ;
int high = nums[nums.size() - ];
int res=nums[];
int mid;
while (low <= high) {
mid = (low + high) / ;
if (!isornot(nums, mid, threshold)) //如果mid不符合,说明,答案在右半个区间,更新low
low = mid + ;
else //否则,在左半个区间,更新high
{
high = mid - ;
res = mid;
}
}
return res;
}
题目给定的值,一定满足有解,所以不用考虑无解的情况,因此,low=1,high=max(nums),即当所有的商为1时,最终和最小,一定小于等于阈值;
(很遗憾,当时思路对,但是没有调试出来!)
题目四:
后续补充~~~
Leetcode 5281. 使结果不超过阈值的最小除数的更多相关文章
- leetcode1283 使结果不超过阈值的最小除数
这道题第一思路是用二分查找 因为使用二分法:所以复杂度为O(n*logk), k介于 left=sum/threshold(向下取整) 和 right=num_max之间:而right<=10^ ...
- JVM调优之服务内存超过阈值报警
今早收到一条短信,具体报警信息如下: [UMP JVM监控内存报警]应用名:发券worker(jdos_couponwkr);KEY[coupon.send.worker.jvm],主机名:[host ...
- C#版(击败100.00%的提交) - Leetcode 744. 寻找比目标字母大的最小字母 - 题解
C#版 - Leetcode 744. 寻找比目标字母大的最小字母 - 题解 744.Find Smallest Letter Greater Than Target 在线提交: https://le ...
- Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)
Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...
- LeetCode 921. 使括号有效的最少添加(Minimum Add to Make Parentheses Valid) 48
921. 使括号有效的最少添加 921. Minimum Add to Make Parentheses Valid 题目描述 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的 ...
- leetcode 945. 使数组唯一的最小增量
题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 mov ...
- 【leetcode 简单】 第一百零九题 最小移动次数使数组元素相等
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...
- Leetcode 363.矩形区域不超过k的最大数值和
矩形区域不超过k的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,-2,3]], ...
- Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)
801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
随机推荐
- 【JVM】【linux】linux上执行jmap命令查看JVM内存使用情况,报错:sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library name
运行命令: jmap -heap 报错如下: Attaching to process ID , please wait... sun.jvm.hotspot.debugger.NoSuchSymbo ...
- 七雄Q传封包辅助技术探讨回忆贴
前言 网页游戏2013年左右最火的类型最烧钱游戏,当年的我也掉坑了.为了边玩还满足码农精神我奋力的学习如何来做外挂.2013年我工作的第二个年头.多一半…介绍下游戏<七雄Q传>是北京游戏谷 ...
- asp.net SQLite关于各版本的调试
最近想做一个简版的管理系统,将SQL SERVER数据库切换到SQLite数据库中,采用的是SQLite3的版本数据库. 开发工具:SV2015 UP3 数据库:SQLite3 项目整体结构图 相同的 ...
- 正则表达式(RegEx)官方手册/权威指南【Python】
前言 正则表达式(称为RE,或正则,或正则表达式模式)本质上是嵌入在Python中的一种微小的.高度专业化的编程语言,可通过 re 模块获得. 使用这种小语言,你可以为要匹配的可能字符串集指定规则:此 ...
- PIE SDK矢量栅格化算法
1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...
- Java I/O系统学习系列二:输入和输出
编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<< ...
- Linux组管理(6)
在linux中每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. 文件/目录的所有者:一般为文件的创建者,谁创建了该文件,就自然成为该文件的所有者 查看文件 ...
- 为什么MES实施起来效果不佳?
原因一:我国制造业存在管理基础的先天不足 我国企业与发达国家企业在管理发展上,存在较大的差别.发达制造国家经历了管理探索.发展.成熟.再提高的全过程,从管理基础的奠定到思想认识的深刻程度,都是我国所无 ...
- 如何修改被readonly修饰的属性
结论: 1.用KVC改变只读属性的值: 2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法 // 该方法默认返回YES. 即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量+ (B ...
- vim编辑器-Linux从入门到精通第四天(非原创)
文章大纲 一.vi介绍二.vim三种模式(重点)三.命令模式四.模式间的切换(重点)五.末行模式六.编辑模式七.实用功能八.扩展九.学习资料下载十.参考文章 一.vi介绍 Vi编辑器是所有Unix ...