链接:https://www.nowcoder.com/acm/contest/71/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描
给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数
输入描述:
第一行输入一个n
接下来一行输入n个正整数ai
输出描述:
输出符合条件个数
示例1
输入
5 1 2 3 4 5
输出
2
说明
5个数中1和2符合条件,1是后面每个数的因子,2是4的因子
备注:
1≤n,ai
≤1000000
时间卡的真是佩服!
刚开始准备交的代码:(能过,后来交的时候发现第一个for()太耗时间了,就准备用数组记录下来,就不需要那个遍历整个了,用空间换时间嘛,结果超时一晚!!!,代码在后面)
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int a[1000005]; int b[1000005]; int main(){ int x, k = 0, n, max = -0x3f3f3f3f, t; scanf("%d", &n); t = n; while(t--){ scanf("%d", &x); a[x]++; if(x > max) max = x; } int count = 0; sort(b, b + n); for(int i = 0; i < 1000005; i++){ if(a[i]) for(int j = i * 2; j <= max; j += i){ if(a[j]){ //判断它的倍数是否存在 count += a[i]; break; } } } printf("%d ", count); return 0; }
血与泪啊!!!
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int a[1000005]; int b[1000005]; int main(){ int x, k = 0, n, max = -0x3f3f3f3f, t; scanf("%d", &n); t = n; while(t--){ scanf("%d", &b[k++]); a[b[k - 1]]++; //记录并排序了有哪些数 //b[k++] = x; 赋值耗时 //直接记录数,方便遍历的时候直接取 // if(b[k - 1] > max) // max = b[k - 1]; } int count = 0; // sort(b, b + n); //耗时 for(int i = 0; i < n; i++){ if(b[i] == 1){ //好吧,我加了一个辅助数组b来存储输入的数 count++; //但当时没写这个判断超时了一晚,真是醉了!!! continue; //没用的辅助数组(i:0 ~ Max(甚至100001))的竟然都直接过了QAQ } // for(int j = 2; j * b[i] <= 1e6+5; j++){ // if(a[j * b[i]]){ //判断它的倍数是否存在 for(int j = b[i] * 2; j <= 1e6+5; j += b[i]){ //上面的改成这样貌似好点 if(a[j]){ count++; break; } } } printf("%d ", count); return 0; }