add zero 9

众所周知一个程序的时间复杂度十分重要,评测机 1s​ 大概能做 10^8次简单运算,所以根据题目所提供的数据范围你就应该精心的策划好你所写程序应该具有的时间复杂度,而在数据范围变大时,想要在时限内完成同样的一个题目,你就不得不设计出一个更快更巧妙的程序,在本题中我们认定数据范围不一样的题目不是同样的题。


现在卡夫卡有一个包含 n​ 个不同题目的题集A ,其中第 i​ (1≤i≤n)​ 个题的数据范围为 10^ai​ ,也就是说第 i个题有 ai​ 个 0​ ,数据保证 ai​ 两两不同。

现在他想从题集A里面选出一些题目,然后把选出的题目后面加 9 个 0​ ,然后加入到一个新题集B里面,但是不能有原题,即这个题数据范围加 9个0​ 后的题不能在题集A里面有同样的题,请问卡夫卡所创造的新题集B里面最多能有多少个题。

输入描述:
第一行包含一个整数 n (1≤n≤5×105) --- 表示题集A中的题目个数。

第二行包含 n 个整数 a1,a2,a3,...,an  (1≤ai​≤109) --- 表示每个题数据范围中 000 的个数,保证  个数互不相同。
输出描述:
输出一行一个整数 --- 表示题集 B 中最多能有多少个题。
示例1

9
11 4 5 14 1 9 19 8 10
输出
复制6

6

#include<bits/stdc++.h>//先排序,然后再用顺序指针进行比较
using namespace std;

int n,s[1000000];
int main()
{
    scanf("%d",&n);
    int k=n;
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&s[i]);
    }
    sort(s+1,s+n+1);
    for(int i=1; i<=n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            if(s[j]-s[i]>9)
            {
                break;
            }
            else if(s[j]-s[i]==9)
            {
                k--;
            }
        }
    }
    printf("%d",k);
}

做题思路与回顾:

1.首先是用的二分查找,但是出现超时问题,但是听说二分也是可以做,这里有些不解;

2.题目中是1e5,但是1e5提交会出错,应提交1e6;

3.直接排序,这样前边的数和后边的数比较,不会重复,比二分查找效率高! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值