zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 181

    ABC181 A - Heavy Rotation

    题目传送门


    代码(签到题)

    #include <cstdio>
    #define rr register
    using namespace std;
    signed main(){
    	rr int n; scanf("%d",&n);
    	return !puts((n&1)?"Black":"White"); 
    } 
    

    ABC181 B - Trapezoid Sum

    题目传送门


    分析

    等差数列求和,记得开long long


    代码

    #include <cstdio>
    #include <cctype>
    #define rr register
    using namespace std;
    inline signed iut(){
    	rr int ans=0; rr char c=getchar();
    	while (!isdigit(c)) c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans;
    }
    signed main(){
    	rr long long ans=0;
    	for (rr int n=iut();n;--n){
    		rr int x=iut(),y=iut();
    		ans+=1ll*(x+y)*(y-x+1)>>1; 
    	}
    	return !printf("%lld",ans);
    } 
    

    ABC181 C - Collinearity

    题目传送门


    分析

    枚举三个点直接判断斜率是否相同,
    但是注意可能存在斜率不存在的情况要特判
    成功罚时qwq


    代码

    #include <cstdio>
    #include <cctype>
    #include <cmath>
    #define rr register
    using namespace std;
    const double eps=1e-8;
    int n,x[111],y[111],cnt[2111];
    inline signed iut(){
    	rr int ans=0,f=1; rr char c=getchar();
    	while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans*f;
    }
     
    signed main(){
    	n=iut();
    	for (rr int i=1;i<=n;++i) x[i]=iut(),y[i]=iut();
    	for (rr int i=1;i<=n;++i)
    	if (++cnt[x[i]+1000]==3)
    		return !printf("Yes");
    	for (rr int i=1;i<n-1;++i)
    	for (rr int j=i+1;j<n;++j)
    	for (rr int o=j+1;o<=n;++o){
    		if (x[i]==x[j]||x[o]==x[j]) continue;
    		rr double A=(y[j]-y[i])*1.0/(x[j]-x[i]);
    		rr double B=(y[o]-y[j])*1.0/(x[o]-x[j]);
    		if (fabs(A-B)<eps) return !printf("Yes");
    	}
    	return !printf("No");
    }
    

    ABC181 D - Hachi

    题目传送门


    分析

    考虑位数小于3特判,由于1000是8的倍数,
    所以只要枚举后三位是否存在8的倍数即可


    代码

    #include <cstdio>
    #include <cstring>
    #define rr register
    using namespace std;
    const int N=200011;
    char s[N]; int cnt[10],len;
    signed main(){
        scanf("%s",s+1),len=strlen(s+1);
        for (rr int i=1;i<=len;++i) ++cnt[s[i]^48];
        if (len==1) return !puts(cnt[8]?"Yes":"No");
        else if (len==2){
        	for (rr int i=1;i<10;++i)
        	for (rr int j=2;j<10;j+=2)
        	if ((i*10+j)%8==0){
        		if (i==j){
        			if (cnt[i]>1) return !puts("Yes");
    			}else{
    				if (cnt[i]&&cnt[j]) return !puts("Yes");
    			}
    		}
    		return !puts("No");
    	}
    	for (rr int j=1;j<10;++j)
    	for (rr int o=2;o<10;o+=2)
    	if ((j*10+o)%4==0){
    		if (j==o){
    			if (cnt[j]<2) continue;
    			cnt[j]-=2;
    		}else{
    			if (!cnt[j]||!cnt[o]) continue;
    			--cnt[j],--cnt[o];
    		}
    		for (rr int i=1;i<10;++i)
    		if ((i*100+j*10+o)%8==0&&cnt[i])
    		    return !puts("Yes");
    		if (j==o) cnt[j]+=2;
    		    else ++cnt[j],++cnt[o];
    	}
    	return !puts("No");
    }
    

    ABC181 E - Transformable Teacher

    题目传送门


    题意

    (m)种身高中选择一种,将其插入一个长度为(n)的序列,
    使得(n+1)个数两两配对后配对的数的差的绝对值和最小

    一句话题意就是

    [largemin_{1leq ileq m}sum_{j=1}^{frac{n+1}{2}}|x_j-y_j|,n=2k+1 ]


    分析

    显然最优的策略就是将长度为(n+1)的序列排序后(2i+1)(2i+2)配对
    然而考虑插入一个数时修改只是局部的,那么考虑维护奇偶配对和偶奇配对的前缀和
    细节有点多,但是画个图就能够明白


    代码

    #include <cstdio>
    #include <cctype>
    #include <algorithm>
    #define rr register
    using namespace std;
    const int N=200011;
    typedef long long lll;
    lll b[N],ans; int n,m,a[N];
    inline signed iut(){
    	rr int ans=0; rr char c=getchar();
    	while (!isdigit(c)) c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans;
    }
    inline lll min(lll a,lll b){return a<b?a:b;}
    signed main(){
    	n=iut(),m=iut(),ans=1e18;
    	for (rr int i=1;i<=n;++i) a[i]=iut();
    	sort(a+1,a+1+n);
    	for (rr int i=2;i<=n;++i) b[i]=b[i-2]+a[i]-a[i-1];
    	for (rr int i=1;i<=m;++i){
    		rr int x=iut();
    		if (x<=a[1]) ans=min(ans,b[n]+a[1]-x);
    		else if (x>=a[n]) ans=min(ans,b[n-1]+x-a[n]);
    		else {
    			rr int j=upper_bound(a+1,a+1+n,x)-a;
    			if (j&1) ans=min(ans,b[j-1]+b[n]-b[j]+a[j]-x);
    			    else ans=min(ans,b[j-2]+b[n]-b[j-1]+x-a[j-1]);
    		}
    	}
    	return !printf("%lld
    ",ans);
    }
    

    ABC181 F - Silver Woods

    题目


    题意

    一个圆的圆心一开始从((-10^9,0))任意运动至((10^9,0))
    要求圆的内部不能经过给定的(n)个点以及直线(y=pm 100)
    问圆的最大半径是多少


    分析

    二分答案,但是直接走很难行得通
    考虑判断它走不通,那也就是存在一条路使得上边界能够“走”到下边界
    对于当前二分到的半径,如果超出边界则与边界连边,否则圆的直径不能超过两点的距离
    并用并查集维护连通性


    代码

    #include <cstdio>
    #include <cctype>
    #define rr register
    using namespace std;
    const int N=111;
    int f[N],siz[N],x[N],y[N],n;
    inline signed iut(){
    	rr int ans=0,f=1; rr char c=getchar();
    	while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans*f;
    }
    inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
    inline void uni(int x,int y){
    	rr int fa=getf(x),fb=getf(y);
    	if (fa==fb) return;
    	if (siz[fa]>siz[fb]) fa^=fb,fb^=fa,fa^=fb;
    	siz[fb]+=siz[fa],f[fa]=fb;
    }
    inline bool check(double mid){
    	for (rr int i=1;i<n+3;++i) f[i]=i,siz[i]=1;
    	for (rr int i=1;i<=n;++i){
    		if (mid*2>100-y[i]) uni(i,n+1);
    		if (y[i]+100<2*mid) uni(i,n+2); 
    		for (rr int j=i+1;j<=n;++j)
    		if ((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<mid*mid*4)
    		    uni(i,j);
    	}
    	return getf(n+1)==getf(n+2);
    }
    signed main(){
    	n=iut();
    	for (rr int i=1;i<=n;++i)
    	    x[i]=iut(),y[i]=iut();
    	rr double l=0,r=100;
    	while (l+1e-6<r){
    		rr double mid=(l+r)/2;
    		if (check(mid)) r=mid;
    		    else l=mid;
    	}
    	return !printf("%lf",l);
    }
    
  • 相关阅读:
    Grumpy: Go 上运行 Python!
    Qt5.7.0配置选项(configure非常详细的参数)
    vs2010 2013 2015+ 必备插件精选(15个)
    solr与.net主从复制
    MVC5模板部署到mono
    solr主从复制
    CentOS 5.5安装图解教程
    VMware7安装CentOS6.5教程
    VMware安装CentOS 图文教程
    在VirtualBox下安装CentOS教程(截图版)
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13912591.html
Copyright © 2011-2022 走看看