[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

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务