zoukankan      html  css  js  c++  java
  • Codeforces 1183F

    Div. 3的题,竟然卡了好久,自闭.jpg
    好像我的思路不太一样呢QAQ

    首先注意到,如果一个数是另一个的因子,那它肯定不会出现在答案中。

    我们先把所有数排序,然后对每个数,我们要往前再找两个数(或者一个,都差不多,就不区分了)和它凑个答案,那我们暴力往前扫,如果碰到它的因子,就直接将这个因子从数列中删掉;如果不是它的因子,就加到答案里,凑满3个就break。

    Q:那这样做找到的前面两个数万一有倍数关系咋办?
    A:不存在的,因为我们之前就把所有数的因子删掉了。
    Q:那怎么删啊?set?map?
    A:删除的话,用类似链表的东西维护下就好了。
    Q:你这个辣鸡做法好暴力啊,复杂度?
    A:扫到每个数的时候,它要么被删掉,要么被统计到答案里了,所以每组是 (O(n)) 的,再加sort(O(nlogn))

    #include<bits/stdc++.h>
    #define LL long long
    #define re register
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define frz(i,x,y) for(int i=x,z=y;i<=z;i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=200003;
    int n,a[N],p[N];
    
    inline void read(int &x){
    	char ch=getchar();x=0;int w=0;
    	for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=1;
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    	if (w) x=-x;
    }
    
    int main(){
    	//init();
    	int T;
    	read(T);
    	while(T--){
    		read(n);
    		fr(i,1,n) read(a[i]);
    		sort(a+1,a+1+n);
    		int ans=0;
    		fr(i,1,n) p[i]=i-1;
    		fr(i,1,n){
    			int sum=a[i],s=1,x=i;
    			while(s<3&&x){
    				if (a[i]%a[x]) s++,sum+=a[x];
    				while(p[x]&&a[i]%a[p[x]]==0) p[x]=p[p[x]];
    				x=p[x];
    			}
    			ans=max(ans,sum);
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    PHP数据采集curl常用的5个例子
    【荐】PHP采集工具curl快速入门教程
    PHP常用正则表达式
    JavaScript方法call、apply、caller、callee、bind的使用详解及区别
    axf、elf文件转换成bin、hex脚本工具
    为什么数据须要做爱
    POJ 3978 Primes(求范围素数个数)
    Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)
    后台进程整理
    Nginx优化具体,应对高并发
  • 原文地址:https://www.cnblogs.com/ymzqwq/p/cf1183f.html
Copyright © 2011-2022 走看看