众所周知一个程序的时间复杂度十分重要,评测机 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.直接排序,这样前边的数和后边的数比较,不会重复,比二分查找效率高!