[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

相关推荐

点赞 评论 收藏
分享
09-10 21:07
已编辑
南京理工大学 C++
第一题bfs,20min搞定第二题,掩码,二进制操作通过24%(把j打成i)调了一个半小时第三题,没时间看了(直接cout第一个用例过10%)
来个白菜也好啊qaq:牛啊,第三题打印第一个用例居然可以拿百分之10不过第二题瞎寄吧写可以拿百分之36的分(两个字符串的string(0,12)比较,一样给yes,不一样给no)
投递华为技术有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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