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] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
随机推荐
- JavaScript 加减危机——为什么会出现这样的结果?
在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...
- disconf的简单使用与远程配置更改为使用本地配置
这几天因为阿里云迁移到腾讯云的原因,原来服务器上的disconf不再使用了.在这段时间里,系统出现的bug很难寻找原因(项目起不来),现在想要把disconf远程配置更改成直接使用本地配置.首先,了解 ...
- PIE截图方法的优化
因为我们组的项目要通过截图获取数据,所以要经常使用截图工具,之前截图都是根据教程(https://www.cnblogs.com/PIESat/p/10243308.html)用的地图显示范围截图,而 ...
- PHP上传图片基本代码示例
一.HTML代码如下: <form name="form2" method="post" action="?type=add" enc ...
- nginx rewrite模块
return 从0.8.42版本开始, return 语句可以指定重定向 url (状态码可以为如下几种 301,302,303,307), 也可以为其他状态码指定响应的文本内容,并且重定向的url和 ...
- Python3的map/reduce
Python内建了map()和reduce()函数. 原文在这里MapReduce: Simplified Data Processing on Large Clusters,map/reduce的概 ...
- 设计模式:单例(Sigleton)模式
题目:设计一个类,我们只能生成该类的一个实例. 只能生成一个实例的类是实现了Singleton(单例)模式的类型. 相关知识: 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象 ...
- Redis_数据类型
Redis支持的键值数据类型如下: 字符串类型 散列类型 列表类型 集合类型 有序集合类型 一.字符串类型 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据.一个字 ...
- node 淘宝镜像
永久使用 打开终端执行 npm config set registry https://registry.npm.taobao.org 临时使用 npm --registry https://regi ...
- 【转载】QQ炫舞手游自制谱子教程(星动模式)
第一步:计算ET和BPM: 抄送原作者部落链接:https://buluo.qq.com/p/detail.html?bid=368006&pid=981862-1529828677& ...