这道题目求解 倒数第二个点死活过不了

冷眼观world 2019-12-27 06:17:23
我的思路是让最大的数除p的minp,看看小于minp的有多少,记下来;让最小的乘p得maxp,看看大于maxp的有多少。最后比较取最小的数,用总数减去即可得最多的数。 代码如下 #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(long a, long b) {
return a > b;
};
int main()
{
vector<long> arr;
long rec = 0L, p = 0L;
int N = 0, cnt_front = 0, cnt_back = 0;

cin >> N >> p;
for(long i = 0L; i < N; i++)
{
cin >> rec;
arr.push_back(rec);
}
sort(arr.begin(), arr.begin() + N, cmp);
int minp = arr[0] / p;
int maxp = arr[N - 1] * p;
int k = N - 1;
int j = 0;
if(arr[0] % p == 0)
--minp;

while(minp >= arr[k--])
++cnt_back;
while(maxp < arr[j++])
++cnt_front;

int min = (cnt_front > cnt_back) ? cnt_back : cnt_front;
cout << N - min;

return 0;
}
...全文
68 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2019-12-27
  • 打赏
  • 举报
回复

int main()
{
vector<long> arr;
int rec;
int N, m, p, i;
cin >> N >> p;
for( i = 0; i < N; i++)
{
cin >> rec;
if ( 0 == i)
m = rec;
else
m = m<rec ? m : rec;
arr.push_back(rec);
}
long mp = m * p;
if ( mp > 1e9) {
cout<< 0;
return 0;
};
int l = arr.size();
for ( i=0; i<arr.size(); i++)
if ( arr[i] > mp ) l --;
cout << l;
return 0;
}

试试看如何
寻开心 2019-12-27
  • 打赏
  • 举报
回复
int maxp = arr[N - 1] * p; 这种乘法是可能越界的
10的9次方是32位int的最大值了, 两个相乘必然是long int才有可能容纳得下

所以, m*p 必须是 long int 64位的, 如果发现结果大于了10的9次方,直接返回0。
因为不可能有M满足这个条件
冷眼观world 2019-12-27
  • 打赏
  • 举报
回复
引用 1 楼 寻开心的回复:
没有理解错的话, 最多两遍循环就解决了

第一遍循环找到m
计算 m*p
第二遍找到所不大于m*p的数的个数就好了啊

sort的排序是最占用时间的
不对 我以前就是这么做的 https://bbs.csdn.net/topics/395186252 也是倒数第二个过不了
寻开心 2019-12-27
  • 打赏
  • 举报
回复
这里可能有的坑 是 m*p超出了10^9的范围,此时输出0就结束了, 第二轮比较都不用比较

不用sort时间就足够了,不会超时的
寻开心 2019-12-27
  • 打赏
  • 举报
回复
没有理解错的话, 最多两遍循环就解决了

第一遍循环找到m
计算 m*p
第二遍找到所不大于m*p的数的个数就好了啊

sort的排序是最占用时间的

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧