心得
昨晚线上个人赛,在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。