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] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
随机推荐
- linux 通过tar直接打包方式 迁移oracle的软件包环境:rdbms/lib/config.c
step1.修改sysctl.conf step2.修改ulimit.conf step3.打包源oracle安装包 step4.通过id{oracle的安装运行用户} 获取安装oracle的[ORA ...
- 有趣的css图形实现
css通过 border .border-radius .transform,实现各种图形. <!DOCTYPE html> <html lang="en"> ...
- windows通过秘钥使用ssh和scp
windows10内置支持了ssh和scp等仿linux指令,可以让我们方便的使用类似linux的工作流把日常的代码资源部署维护工作写成脚本(批处理). ssh和scp都有-i参数可以通过指定一个私钥 ...
- C#中几种单例模式
1.静态代码块 /// <summary> /// 静态代码块 /// 仅在第一次调用类的任何成员时自动执行 /// </summary> public class Singl ...
- GIT篇章(二)
如何多人协同开发同一个项目? 使用代码版本控制[version control]软件, 目前市面上比较流行的代码版本控制器有: git,svn,csv 1. 使用git管理代码版本 本项目使用git管 ...
- git操作:删除仓库中的文件或目录
假定当前分支下,abc/123.txt需要从git仓库中删除: git .txt //删除abc目录下的123.txt文件,如果要删除abc目录,使用命令:git rm -r --cached abc ...
- CPU和Memory压力测试方法
一:用原生Centos自带的工具 1. CPU 下面命令会创建 CPU 负荷,方法是通过压缩随机数据并将结果发送到 /dev/null: cat /dev/urandom | gzip -9 > ...
- 配置管理-git研究(版本管理)
1. 安装git2.7 git2.7具体安装步骤如下: [root@host1 ~]# yum install curl-devel expat-devel gettext-devel openssl ...
- ansible自动化运维04
ansible playbook ansible-playbook命令格式: ansible-playbook [option] filename(剧本名字) ansible-playbook 命 ...
- cocoapods升级
1.更新gem:sudo gem update --system 先要查看下源,如果源被墙了就换地址:https://gems.ruby-china.com 1.1.删除gem源:gem source ...