Codeforces Round #552 (Div. 3) ABCDE题解

题目链接:

http://codeforces.com/contest/1154

A. Restoring Three Numbers

注意看清题意,是a+b不是-a+b;

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
ll x[4];
int main()
{
    for (int i=0;i<4;i++)
    {
        scanf("%lld",&x[i]);
    }
    int loc=-1;
    for (int i=0;i<4;i++)
    {
        if(2*x[i]==(x[(i+1)%4]+x[(i+2)%4]+x[(i+3)%4]))
        {
            loc=i;
            break;
        }
    }
    printf("%lld %lld %lld\n",x[loc]-x[(loc+1)%4],x[loc]-x[(loc+2)%4],x[loc]-x[(loc+3)%4]);
    return 0;
}

B. Make Them Equal

计算不同数的种类kind,然后分类讨论

如果kind>3 则直接输出-1

如果kind==3 ,则看看左右数和中间数的绝对值差是否相等

如果kind==2,则一定有解,因为求最小的,则尽量缩小范围,如果差为偶数,则答案需要/2,如果为奇数,则直接输出

如果kind==0,则输出0

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
int a[maxn];
int num[maxn];
int main()
{
    int kind=0;
    memset (num,0,sizeof(num));
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(num[a[i]]==0)
        {
            kind++;
        }
        num[a[i]]++;
    }
    if(kind==1)
    {
        printf("0\n");
        return 0;
    }
    if(kind==2)
    {
        int cnt=0;
        int b[5];
        for (int i=0;i<=100;i++)
        {
            if(num[i])
            {
                b[cnt++]=i;
            }
        }
        if((b[0]+b[1])%2)
        {
            printf("%d\n",abs(b[0]-b[1]));
        }
        else
            printf("%d\n",abs(b[0]-b[1])/2);
        return 0;
    }
    if(kind==3)
    {
        int cnt=0;
        int b[5];
        for (int i=0;i<=100;i++)
        {
            if(num[i])
            {
                b[cnt++]=i;
            }
        }
        if(b[2]-b[1]==b[1]-b[0])
        {
            printf("%d\n",b[1]-b[0]);
        }
        else printf("-1\n");
    }
    if(kind>=4) printf("-1\n");
    return 0;
}

C. Gourmet Cat 

模拟 ,以星期中的某一天开始,然后开始模拟,求出最大值即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
ll numa,numb,numc;
ll ans=-1;
int main()
{
    scanf("%lld%lld%lld",&numa,&numb,&numc);
    for (int i=1;i<=7;i++)
    {
        ll tnuma=numa,tnumb=numb,tnumc=numc;
        ll temp=0;
        int ok=0;
        for (int j=i;j<=7;j++)
        {
            if((j==1||j==4||j==7))
            {
                if(tnuma)
                {
                    tnuma--;
                    temp++;
                }
                else
                {
                    ok=1;
                    break;
                }
            }
            else if(j==2||j==6)
            {
                if(tnumb)
                {
                    tnumb--;
                    temp++;
                }
                else
                {
                    ok=1;
                    break;
                }
            }
            else if(j==3||j==5)
            {
                if(tnumc)
                {
                    tnumc--;
                    temp++;
                }
                else
                {
                    ok=1;
                    break;
                }
            }
        }
        if(ok==1)
        {
            ans=max(ans,temp);
            continue;
        }
        ll t1=tnuma/3;
        ll t2=tnumb/2;
        ll t3=tnumc/2;
        ll ci=min(t1,min(t2,t3));
        tnuma=tnuma-ci*3;
        tnumb=tnumb-ci*2;
        tnumc=tnumc-ci*2;
        temp=temp+ci*7;
        for (int j=1;j<=7;j++)
        {
            if((j==1||j==4||j==7))
            {
                if(tnuma)
                {
                    tnuma--;
                    temp++;
                }
                else
                {
                    break;
                }
            }
            else if(j==2||j==6)
            {
                if(tnumb)
                {
                    tnumb--;
                    temp++;
                }
                else
                {
                    break;
                }
            }
            else if(j==3||j==5)
            {
                if(tnumc)
                {
                    tnumc--;
                    temp++;
                }
                else
                {
                    break;
                }
            }
        }
        ans=max(ans,temp);
       // printf("i=%d ans=%lld\n",i,ans);
    }
    printf("%lld\n",ans);
    return 0;
}

D. Walking Robot 

贪心,注意,此题电池的数目最大为储存容量,不能超过。

当s[i]=0时,优先使用蓄电池。

当s[i]=1时,如果此时蓄电池满的话,则优先使用蓄电池,然后再使用电池,注意蓄电池+1时不能超过自身容量。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2*1e6+5;
int n,a,b;
int s[maxn];
int main()
{
    scanf("%d%d%d",&n,&b,&a);
    int nb=b,na=a;
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
    }
    int ans=0;
    for (int i=1;i<=n;i++)
    {
        if(s[i]==0)
        {
            if(a==na)
            {
                ans++;
                na--;
            }
            else if(na>0)
            {
                ans++;
                na--;
            }
            else
            {
                if(nb>0)
                {
                    ans++;
                    nb--;
                }
                else
                {
                    break;
                }
            }
        }
        else
        {
            if(a==na)
            {
                ans++;
                na--;
            }
            else if(nb>0)
            {
                nb--;
                na++;
                ans++;
            }
            else
            {
                if(na>0)
                {
                    na--;
                    ans++;
                }
                else
                {
                    break;
                }
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

 E. Two Teams

建立双向链表解决此题。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2*1e5+5;
int n,k;
int loc[maxn];
int vis[maxn];
int ans[maxn];
struct List
{
    int next;
    int pre;
    int data;
};
List l [maxn];
int main()
{
    scanf("%d%d",&n,&k);
    memset (vis,0,sizeof(vis));
    memset (l,-1,sizeof(l));
    for (int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        loc[x]=i;
        l[i].data=x;
        if(i==1)
        {
            l[i].pre=-1;
            continue;
        }
        l[i].pre=i-1;
        l[i-1].next=i;
    }
    l[n].next=-1;
    int num=0;
    int kt=n;
    int ci=0;
    while(num<n)
    {
        ci++;
        int an;
        if(ci%2) an=1;
        else an=2;
        while(vis[kt]) kt--;
        int pos=loc[kt];
        vis[kt]=1;
        ans[pos]=an;
        num++;
        int hpo=pos;
        int tpo=pos;
        int hp=-1,tp=-1;
        for (int i=0;i<k;i++)
        {
            if(l[hpo].pre==-1)
            {
                hp=-1;
                break;
            }
            hpo=l[hpo].pre;
            ans[hpo]=an;
            vis[l[hpo].data]=1;
            hp=hpo;
            num++;
        }
        for (int i=0;i<k;i++)
        {
            if(l[tpo].next==-1)
            {
                tp=-1;
                break;
            }
            tpo=l[tpo].next;
            ans[tpo]=an;
            vis[l[tpo].data]=1;
            tp=tpo;
            num++;
        }
        if(hp==-1&&tp==-1) break;
        if(hp!=-1&&tp!=-1)
        {
            if(l[tp].next!=-1) l[l[tp].next].pre=l[hp].pre;
            if(l[hp].pre!=-1) l[l[hp].pre].next=l[tp].next;
        }
        if(hp==-1)
        {
            if(l[tp].next!=-1) l[l[tp].next].pre=-1;
        }
        if(tp==-1)
        {
            if(l[hp].pre!=-1) l[l[hp].pre].next=-1;
        }
        //printf("num=%d\n",num);
    }
    for (int i=1;i<=n;i++) printf("%d",ans[i]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/89364825