码迷,mamicode.com
首页 > 其他好文 > 详细

contest 1004

时间:2020-03-16 19:12:05      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:酒店   lse   sizeof   void   情况   等于   数组   def   bre   

A:每家酒店两侧最多都可以建这个新酒店,将两酒店之间距离不合法的情况减去即可,数组都不用开。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,d,a,s,b;
    cin>>n>>d>>a;
    s=n<<1;
    while(--n)
    {
        b=a;
        cin>>a;
        s-=(a-b<=d<<1)+(a-b<d<<1);
    }
    cout<<s;
    return 0;
}

B:\(01\) 个数乘积最大?两数和相等,很明显两数越相近乘积越大,这里补一个证明:
设当前两数分别为 \(x\)\(y\)\(x\leq y\)
\(xy-(x-1)(y+1)=xy-xy-x+y-1=y-x+1>0\)
得证。
于是乎间隔着放 01

#include<bits/stdc++.h>
using namespace std;
#define For(i,x,y)for(i=x;i<=y;i++)
int main()
{
    int n,i;
    cin>>n;
    For(i,1,n)putchar((i&1)+'0');
    return 0;
}

C:倒着扫,不考虑两数相同的数对,记录数字种数 \(total\) 和每种数字之前匹配到的数对个数 \(number\),第 \(i\) 个点作为第一个数字的贡献即为 \(total-number\)。最后记得加上两数相同的数对。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100005
#define For(i,x,y)for(i=x;i<=y;i++)
#define Down(i,x,y)for(i=x;i>=y;i--)
int tot[N],a[N],c[N];
int main()
{
    ll s;
    int n,i,now,tmp;
    s=now=0;
    scanf("%d",&n);
    For(i,1,n)scanf("%d",&a[i]);
    Down(i,n,1)
    {
        c[a[i]]++;
        if(tot[a[i]])s+=now-tot[a[i]];
        else s+=now++;
        tot[a[i]]=now;
        /*printf("%I64d\n",s);*/
    }
    For(i,1,n)
    if(c[i]>1)s++;
    printf("%I64d",s);
    return 0;
}

D:先看出这是曼哈顿距离。假设矩阵无穷大,那么环绕着的数字个数为 \(4,8,12...\),菱形边长每次加一。所以可以算出第一个越过边界的数字是什么。因为相对位置没有要求,所以这个数字可以看做是 \(min(x,y)\)。暴力枚举 \(n,m\),因为 \(n\times m=t\) 所以这是 \(\sqrt t\) 的。自然可以推出这么一个式子 \(n+m-x-y\) 等于序列中最大的数 \(z\)。现在我们知道了什么?若 \(x\leq y\),则知道了\(n,m,x,z\),所以可以算出\(y\)。然后暴力算出整个矩阵的数进行对比。总复杂度 \(\mathcal O(t\sqrt t)\)
需要注意的是,\(n\) 不一定小于等于 \(m\)\(x\) 不一定小于等于 \(y\),否则会 Wa On Test36。

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define Max(x,y)(x>y?x:y)
#define For(i,x,y)for(i=x;i<=y;i++)
#define Memc(i,j)memcpy(i,j,sizeof i)
int a[N],b[N];
int read()
{
    int A;
    bool K;
    char C;
    C=A=K=0;
    while(C<'0'||C>'9')K|=C=='-',C=getchar();
    while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
    return(K?-A:A);
}
inline void sw_ap(int&_,int&__)
{
    _^=__^=_^=__;
}
int main()
{
    bool rem;
    int t,i,mx=0,n,m,x,y,mn,j;
    t=read();
    For(i,1,t)
    {
        x=read();
        a[x]++;
        mx=Max(mx,x);
    }
    if(a[0]!=1)cout<<-1,exit(0);
    For(i,1,t)
    if(a[i]>i<<2)cout<<-1,exit(0);
    else if(a[i]<i<<2)break;
    mn=i;
    /*cout<<mn<<endl;*/
    For(n,1,t)
    if(!(t%n))
    {
        m=t/n;
        x=mn;
        y=m+n-x-mx;
        /*cout<<n<<' '<<m<<' '<<x<<' '<<y<<endl;*/
        if(x<0||x>n||y>m)continue;
        Memc(b,a);
        rem=0;
        For(i,1,n)
        For(j,1,m)
        {
            a[abs(i-x)+abs(j-y)]--;
            if(a[abs(i-x)+abs(j-y)]<0)
            {
                rem=1;
                break;
            }
            if(rem)break;
        }
        if(!rem)cout<<n<<' '<<m<<endl<<x<<' '<<y,exit(0);
        Memc(a,b);
    }
    cout<<-1;
    return 0;
}

contest 1004

标签:酒店   lse   sizeof   void   情况   等于   数组   def   bre   

原文地址:https://www.cnblogs.com/May-2nd/p/12505807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!