AtCoder Regular Contest 100

C.傻逼题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define gc getchar()
#define lint long long
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=200010;int a[N];
inline int gabs(int x) { return x<0?-x:x; }
int main()
{
    int n=inn();lint ans=0;
    for(int i=1;i<=n;i++) a[i]=inn()-i;
    sort(a+1,a+n+1);int b=a[(n+1)/2];
    for(int i=1;i<=n;i++) ans+=gabs(b-a[i]);
    return !printf("%lld\n",ans);
}

D.考虑枚举中间的分割线,左右的分割线都是越靠各自中间的段越好。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#define gc getchar()
#define lint long long
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
#define N 200010
#define Max(a,b,c,d) max(max(a,b),max(c,d))
#define Min(a,b,c,d) min(min(a,b),min(c,d))
#define update(ans,a,b,c,d) ans=min(ans,Max(a,b,c,d)-Min(a,b,c,d))
using namespace std;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int a[N];lint s[N];
int main()
{
    int n=inn();lint ans=LLONG_MAX;
    for(int i=1;i<=n;i++) a[i]=inn();
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
    for(int i=2,j=1,k=3;i<n-1;i++)
    {
        while(j<i-1&&s[j+1]<=s[i]-s[j+1]) j++;
        while(k<n-1&&s[k+1]-s[i]<=s[n]-s[k+1]) k++;
        lint s1=s[j],s2=s[i]-s[j],s3=s[k]-s[i],s4=s[n]-s[k];
        update(ans,s1,s2,s3,s4);int L=(j<i-1),R=(k<n-1);
        if(L) update(ans,s1+a[j+1],s2-a[j+1],s3,s4);
        if(R) update(ans,s1,s2,s3+a[k+1],s4-a[k+1]);
        if(L&&R) update(ans,s1+a[j+1],s2-a[j+1],s3+a[k+1],s4-a[k+1]);
    }
    return !printf("%lld\n",ans);
}

E.据说有二的n次的fzt什么的但是不会,实际上3的n次的找集合最大值和次大值相加也能过。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#define gc getchar()
#define lint long long
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
#define N 300010
using namespace std;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int a[N];char ss[N*12],tt[20];int ssl,ttl;
inline int show(int x)
{
    if(!x) ss[++ssl]='0';
    ttl=0;while(x) tt[++ttl]=x%10+'0',x/=10;
    while(ttl--) ss[++ssl]=tt[ttl+1];ss[++ssl]='\n';
    return 0;
}
int main()
{
//  freopen("data.in","r",stdin),freopen("std.out","w",stdout);
    int k=inn(),n=1<<k;
    for(int i=0;i<n;i++) a[i]=inn();
    for(int i=1,ans=0,mx,se;i<n;i++)
    {
        mx=a[0],se=0;
        for(int j=i;j;j=(j-1)&i)
            if(a[j]>mx) se=mx,mx=a[j];
            else se=max(se,a[j]);
        show(ans=max(ans,mx+se));
    }
    return fwrite(ss+1,sizeof(char),ssl,stdout),0;
}

猜你喜欢

转载自blog.csdn.net/mys_c_k/article/details/80882390