Codeforces Round #340 (Div. 2)

Codeforces Round #340 (Div. 2)

1月24日

A. Elephant

题意:略.

思路:略.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int k=n/10;
        k*=2;
        if(n%10 > 5)
            printf("%d\n",k+2);
        else if(n%10<=5 && n%10 >0)
            printf("%d\n",k+1);
        else
            printf("%d\n",k);
    }
    return 0;
}

B. Chocolate

题意:0代表没有坚果,1代表有一个坚果。要求分割开之后每一块巧克力上面至少有一块坚果。

思路:每两个'1'直接有n个'0'的,共有n+1种分法,然后每两个'1'直接的分法直接相乘就是正确答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int a[105];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int flag=0;
        ll k=0;
        ll ans=1;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==0 && flag)
            {
                k++;
            }
            if(a[i]==1 && !flag)
            {
                k=0;
                flag=1;
            }
            else if(a[i]==1 && flag)
            {
                ans=ans*(k+1);
                k=0;
            }
            //printf("k=%I64d ans=%I64d flag=%d\n",k,ans,flag);
        }
        if(!flag)
            printf("0\n");
        else
            printf("%I64d\n",ans);
    }
    return 0;
}

C. Watering Flowers

题意:有两个喷泉,喷洒的半径分别为r1,r2.r1^2+r2^2,最小的情况下覆盖所有的花.

思路:用一个结构体分别保存每朵花到两个喷泉的距离,然后按照到一个喷泉的距离,从小到大排序。暴力循环一下找到最小值就是答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define inf 0x3f3f3f3f3f3f3f3f
int n;
LL x11,y11;
LL x22,y22;
struct node
{
    LL r1;
    LL r2;
};
node a[2100];
bool cmp(node aa,node bb)
{
    if(aa.r1==bb.r1) return aa.r2<bb.r2;
    else return aa.r1<bb.r1;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        LL  x,y;
        scanf("%I64d%I64d%I64d%I64d",&x11,&y11,&x22,&y22);
        a[0].r1=0;
        a[0].r2=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%I64d%I64d",&x,&y);
            a[i].r1=(x-x11)*(x-x11)+(y-y11)*(y-y11);
            a[i].r2=(x-x22)*(x-x22)+(y-y22)*(y-y22);
        }
        a[n+1].r1=0;
        a[n+1].r2=0;
        a[n+2].r1=0;
        a[n+2].r2=0;
        sort(a+1,a+n+1,cmp);
        LL ans=inf;
        LL sum1=0;
        for(int i=0; i<=n; i++)
        {
            sum1=a[i+1].r2;
            for(int j=i+2; j<=n; j++)
            {
                sum1=max(a[j].r2,sum1);
            }
            ans=min(ans,a[i].r1+sum1);
            //printf("%I64d %I64d\n",ans,a[i].r1+sum1);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

D. Polyline

题意:略.

思路:直接按照情况写就好了.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
struct node
{
    LL x;
    LL y;
};
node a[5];
LL x[5],y[5];
bool cmp(node aa,node bb)
{
    if(aa.x==bb.x) return aa.y<bb.y;
    else return aa.x<bb.x;
}
int main()
{
    while(scanf("%I64d %I64d %I64d %I64d %I64d %I64d",&a[0].x,&a[0].y,&a[1].x,&a[1].y,&a[2].x,&a[2].y)!=EOF)
    {
       // cout << endl;
        sort(a,a+3,cmp);
        //for(int i=0; i<3; i++)
          //  printf("%I64d %I64d\n",a[i].x,a[i].y);

        if((a[0].x==a[1].x && a[1].x==a[2].x ) || (a[0].y==a[1].y && a[1].y==a[2].y))
            printf("1\n");
        else if(a[0].x==a[1].x && (a[2].y<=a[0].y || a[2].y>=a[1].y))
            printf("2\n");
        else if(a[1].x==a[2].x && (a[0].y<=a[1].y || a[0].y>=a[2].y))
            printf("2\n");
        else if(a[0].y==a[1].y && a[2].x>=a[1].x)
            printf("2\n");
        else if(a[1].y==a[2].y && a[0].x<=a[1].x)
            printf("2\n");
        else
            printf("3\n");
    }
    return 0;
}

你可能感兴趣的:(Codeforces Round #340 (Div. 2))