------------只要够努力,人生最坏的结局不过是大器晚成!!!

链接:https://www.nowcoder.com/acm/contest/71/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制: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,a
i
≤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\n", 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\n", count);
	return 0;
} 

  

posted on 2018-02-02 23:47  ystraw  阅读(226)  评论(0编辑  收藏  举报

不经一番切孤寒,怎得梅花扑鼻香