[PAT解题报告] Perfect Sequence

不太难,我出的题……
给定一个正整数序列,再给一个正整数p, 选出最多选出多少个数,使得最小值不超过最大值的p倍?
因为只考虑最小值和最大值,所以可以把原数列排序。 
假设数组a[]都排好序了。
我们对起点i,循环找到最后一个满足条件的位置j >= i。
当i + 1的时候,注意j仍然有效,因为a[j] <= p * a[i] <= p * a[i + 1],所以j没必要重新循环,而是从上一次的最后一个位置继续向后找就行了。
所以不算排序的话,对每个i找到j的时间复杂度是O(n)的,因为i, j都只循环了n次而已。
另外注意,判断p倍可能超int,所以建议用除法(上取整)来判断倍数关系。

代码:
#include <cstdio>
#include <algorithm>
using namespace std;

int a[100006];

int main() {
int answer = 1, m ,n ;
    scanf("%d%d",&n,&m);
    for (int i = 0;i < n; ++i) {
        scanf("%d",a + i);
    }
    sort(a, a + n);
    for (int i = 0, j = 0; (i < n) && (j < n); ++i) {
        for (; (j < n) && ((a[j] + a[i] - 1) / a[i] <= m); ++j)
        ;
        answer = max(answer, j - i);
    }    
    printf("%d\n",answer);
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1085
全部评论
你自己出的题,你自己放的代码,在你们官方的OJ上居然还能通不过?
点赞 回复 分享
发布于 2015-09-02 11:06
 答案不对, 复制到这题的OJ里跑,报浮点错误 这句有问题:    for (; (j < n) && ((a[j] + a[i] - 1) / a[i] <= m); ++j)  a[i]可能为0,然后看不懂在干什么,  改为for (; (j < n) && ((a[j]  <= m*a[i] ); ++j)则能全过
点赞 回复 分享
发布于 2017-08-01 16:08
***吗这个
点赞 回复 分享
发布于 2017-08-01 23:39

相关推荐

不愿透露姓名的神秘牛友
06-27 15:19
简历上能写3个月吗?
码农索隆:大胆写,主要你能把实习经历包装好,可以看一下我这篇帖子https://www.nowcoder.com/share/jump/4888395581180798063
点赞 评论 收藏
分享
king122:专业技能不要写这么多,熟悉和熟练你经不住问,排版有些难看,中间的空隙搞小一点,项目描述的话感觉是从课程中抄下来的,改一改吧,不然烂大街了,每个项目都写一两点,用什么技术实现了什么难点,然后再写一些数字上去像时间又花了90%这样,这样面试会多一些,如果觉得自己的项目还是不够用的话,我有几个大厂最近做过的实习项目,感兴趣的话可以看我简介中的项目地址
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务