zoukankan      html  css  js  c++  java
  • 普通打击「CSP多校联考 2019」

    题意

    给定两个序列,可以以任意方式对其重排序,然后每一位求和,求新序列的众数出现次数。


    思路

    出题人的数据只用了一个(rand()),所以比较大的情况下答案会在32768附近,暴力枚举一下即可。

    对于一个枚举的众数(x),答案为(sum_{i=0}^x min(ma[i],mb[x-i]))

    (事实证明数据比想象的还要水一点)

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    namespace StandardIO {
    
        template<typename T>inline void read (T &x) {
            x=0;T f=1;char c=getchar();
            for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;
            for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
            x*=f;
        }
    
        template<typename T>inline void write (T x) {
            if (x<0) putchar('-'),x*=-1;
            if (x>=10) write(x/10);
            putchar(x%10+'0');
        }
    
    }
    
    using namespace StandardIO;
    
    namespace Project {
    	
    	const int N=100100;
    	const int INF=2147483647;
    	
    	int n,ans,maxa,maxb;
    	int a[N],b[N];
    	int ma[N],mb[N];
    	
    	inline void calc (int x) {
    		int res=0;
    		for (register int i=0; i<=x; ++i) res+=min(ma[i],mb[x-i]);
    		ans=max(ans,res);
    	}
    	
    	inline void MAIN () {
    		read(n);
    		for (register int i=1; i<=n; ++i) 
    			read(a[i]),++ma[a[i]],maxa=max(maxa,a[i]);
    		for (register int i=1; i<=n; ++i) 
    			read(b[i]),++mb[b[i]],maxb=max(maxb,b[i]);
    		if (maxa<=5000&&maxb<=5000) for (register int i=5000-60; i<=5000+60; ++i) calc(i);
    		else for (register int i=32768-23; i<=32768+23; ++i) calc(i);
    		write(ans);
    	}
    
    }
    
    int main () {
    //    freopen(".in","r",stdin);
    //    freopen(".out","w",stdout);
        Project::MAIN();
    }
    
    
  • 相关阅读:
    Netty指定分隔的字符
    Netty解决TCP粘包/拆包问题
    TCP粘包/拆包问题
    Netty5-应答服务器
    线程池中的线程的排序问题
    Java NIO 概述
    在windows中,如何使用cmd命令行窗口正确显示编码为utf-8格式的文字
    OXM
    Mysql event时间触发器,实现定时修改某些符合某一条件的某一字段
    linux 环境 tomcat 莫名奇妙挂掉
  • 原文地址:https://www.cnblogs.com/ilverene/p/11813040.html
Copyright © 2011-2022 走看看