2020-08-08(A - MaratonIME stacks popcorn buckets 、C - MaratonIME eats japanese food )

2020/8/07个人赛总结

心得

昨晚线上个人赛,在VJ上打,打到了23:00,就没有写博客,今天早上补上。昨天我做的div2,感觉简单不少,就是有些题题意难理解,别的都还好,都是一些简单的优化算法或者暴力解题。

题目

A

在这里插入图片描述

题意:有n桶爆米花,第r桶有r个爆米花,将这些爆米花合到一个桶中,每次合第a桶和a+1桶,每合一桶会掉一个爆米花。
思路:求n相和然后Sn-n+1。求n的阶乘不能用for循环累加,会超时,
建议优化一下求和的算法,很简单,用等差数列的求和公式就行:Sn=n*(n+1)/2。

AC代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    
    
    long long int n, i, sum = 0;
    scanf("%lld", &n);
    sum = n * (n + 1) / 2;
    printf("%lld\n", sum-n+1);
    return 0;
}

C

在这里插入图片描述
在这里插入图片描述
题意:在一个桌子上放盘子和拿盘子,要求盘子和盘子之间不能重叠(盘子都视为正规的圆)。
思路:从第一次开始遍历,知道第i次,暴力求解;
注意:
<1>
放盘子的时候,要注意两个盘子是否有公共区域,有的话不行,简单地说就是已知两个圆的圆心和半径,判断两圆是否相交或者相切。可以直接套用以下公式:若可以放置(r1+r2)^2 < (x1-x2)^2 + (y1-y2)^2
<2>
判断之前已经有的盘子时,不要忘记判断一下是不是该盘子的半径。(这个就是比赛时容易忽略的点)比如:
A 10 10 10
R 10 10 10
A 10 10 1
A 15 15 1
这个例子应该是输出4Ok,可以试试自己的程序对不对

AC代码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int f[1010][1010];
int R[1010][1010];
struct
{
    
    
    char c;
    int x;
    int y;
    int r;
}a[5010];
int main()
{
    
    
    memset(f,0,sizeof(f));
    memset(R,0,sizeof(R));
    int t,i;
    scanf("%d",&t);
    for(i=0;i<t;i++)
    {
    
    
        scanf(" %c %d %d %d",&a[i].c,&a[i].x,&a[i].y,&a[i].r);
        if(a[i].c=='A')
        {
    
    
            if(f[a[i].x][a[i].y]==1)
                printf("No\n");
            else
            {
    
    
                int j;
                int k=0;
                for(j=0; j<i; j++)
                {
    
    
                    if(a[j].c=='A'&&f[a[j].x][a[j].y]==1&&R[a[j].x][a[j].y] == a[j].r)
                    {
    
    
                        if((a[j].r+a[i].r)*(a[j].r+a[i].r)>(a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y))
                        {
    
    
                            printf("No\n");
                            k=1;
                            break;
                        }
                    }
                }
                if(k==0)
                {
    
    
                    printf("Ok\n");
                    f[a[i].x][a[i].y]=1;
                    R[a[i].x][a[i].y]=a[i].r;
                }
            }
        }
        else if(a[i].c=='R')
        {
    
    
            if(f[a[i].x][a[i].y]==1&&R[a[i].x][a[i].y]==a[i].r)
            {
    
    
                printf("Ok\n");
                f[a[i].x][a[i].y]=0;
                R[a[i].x][a[i].y]=0;
            }
            else
               printf("No\n");
        }

    }
    return 0;
}

别的题都是一些简单题,也不需要优化算法,就不往博客里写了。

总结

英语读题能力有待提升,读英语题目太慢。
写一个算法的时候首先考虑能不能优化该算法,能优化尽量优化,不要出现TLE。

猜你喜欢

转载自blog.csdn.net/rookie636/article/details/107874362
今日推荐