这场比赛没有丝毫的心理准备,突然间的就宣布,要进行比赛。不免心中有些忐忑。
不过还好,比赛题目不算难,大三学长有一个AK的。ORZ,需要学长们,仍需努力。
总体来说,这次题目,比较简单,半个小时内AC,3道,足以见的题目的难易程度。当A完第三道的时候,看了一下排名,第二。我擦,瞬间心情放松了起来。不过,也不敢有所懈怠,毕竟,题目比较简单,自己只不过,眼疾手快的水了几道比较水的题目。不过,前3道,有2道是跟风做的,第一道是自己看到的原题。而且是,全场第一个提交的并且AC 的。而且其他的两题,出题速度很快,可以肯定就是,水题。对待水题的态度,就是立刻水他,为以后的题目留下足够的时间去思考。
当水完3道题目后,大家在后来的20分钟之内,出题的速度就没有那么快了。这时,我就很是迷茫了,不知道该跟哪个题。有那么一段时间,自己在犹豫。犹豫了有一小会儿,才决定做D题,因为,现在有人出这道了。看了一下题目,模拟吧。就开始写。大约半个小时,调试出来以后,提交,WA。在提交了5次之后,决定再次读一下题目。发现了一个小的bug,果断改啊。AC。在大约还有一个小时多一点的时间,这道题,AC了。
这会儿看到很多人过了E题,看一下,字符串处理,而且有很多的函数,本来就是可以直接调用的,但是,很多函数直接没有用过,前几天还转过一个有关字符串的文章,但是,没有来的及看,就错过了。不过,看有不少人都给过了,还不算太难,就决定,都自己写了。一个函数,一个函数的慢慢写,写了有快50分钟吧,因为是,一遍写,一遍调试的,所以,比较慢,但是,事实证明,虽然慢,但是,还是很有效果的。1A。
这会儿,时间还有不到20分钟的时间吧,看了其他两道,C题感觉是递推,F题计算几何。递推,以前看过比较简单的,计算几何就没有怎么弄过,由于时间比较短了,没有怎么思考,随便写了一个递推,没有抱着AC的心态去的,但是,果然WA了。自己,有想了一会儿,果断,比赛时间到了。
最后看了一下排名,恩,还行,第三,继续努力。
这次比赛,发挥还可以,我感觉,
最重要的是头脑的清醒,头脑不清醒的话,做出的决定会很不明智的。所以,比赛中,一定要保持头脑的清醒。
再有,比赛,要适时的看rank,看的多了,不好。
嗯,继续走。
比赛时的E题。题目链接:点击打开链接
比较简单的模拟,就是比较繁琐,一个函数一个函数的写的,写一个测试一个,保证没有什么错误,直接提交,直接AC,但是,下来,有人看到我的代码问题,后来,我一看,还真是,Delete 的时候,没有判断i,j的相对大小,所以,但是,测试数据上面是就是大小相反的。我擦,没有注意到,但是,估计测试数据中也没有这种情况,让我给幸运的AC的。不的不说,太幸运了。不过,从这次的这道题来看,还是自己考虑不够周全,其实,在比赛的时候,就一直担心这一点,还是给忽视了。
代码:(比较长点)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=105;
char str[N];
void Insert(){
int k;
char A[N];
scanf("%d%s",&k,A);
if(k<0||k>strlen(str)) {
printf("error\n");
return ;
}
char tmp[N];int top1=0;
for(int i=0;i<k;i++){
tmp[top1++]=str[i];
}
int l=0;
while(A[l]!='\0'){
tmp[top1++]=A[l++];
}
for(int i=k;i<strlen(str);i++)
tmp[top1++]=str[i];
tmp[top1]='\0';
strcpy(str,tmp);
printf("%s\n",str);
}
void Double(){
int len=strlen(str);
if(len==0) {
printf("error\n");
return ;
}
for(int i=0;i<len;i++){
str[i+len]=str[i];
}
str[len*2]='\0';
printf("%s\n",str);
}
void Delete(){
int begin,end;
scanf("%d%d",&begin,&end);
int len=strlen(str);
if(len==0){
printf("error\n");
return ;
}
else if(begin<0||end>len-1){
printf("error\n");
return ;
}
char tmp[N];
strcpy(tmp,str);
for(int i=min(begin,end);i<=max(begin,end);i++){
tmp[i]='#';
}
int top2=0;
for(int i=0;i<len;i++){
if(tmp[i]!='#'){
str[top2++]=tmp[i];
}
}
str[top2]='\0';
printf("%s\n",str);
}
void Change(){
int x,y;
scanf("%d%d",&x,&y);
int len=strlen(str);
if(len==0){
printf("error\n");
return ;
}
if(x>=len||x<0||y<0||y>=len){
printf("error\n");
return ;
}
swap(str[x],str[y]);
printf("%s\n",str);
}
void Reverse(){
int len=strlen(str);
if(len==0){
printf("error\n");
return ;
}
char tmp[N];int top3=0;
for(int i=len-1;i>=0;i--){
tmp[top3++]=str[i];
}
tmp[top3]='\0';
strcpy(str,tmp);
printf("%s\n",str);
}
void Rotate(){
int x;
scanf("%d",&x);
int len=strlen(str);
if(len==0){
printf("error\n");
return ;
}
char tmp[N*2];int top4=0;
x=x%len;
for(int i=x;i<len;i++){
tmp[top4++]=str[i];
}
for(int i=0;i<x;i++){
tmp[top4++]=str[i];
}
tmp[top4]='\0';
strcpy(str,tmp);
printf("%s\n",str);
}
int main(){
int n;
while(~scanf("%d",&n)){
getchar();
gets(str);
for(int i=1;i<=n;i++){
char order[N];
scanf("%s",order);
if(strcmp(order,"insert")==0){
Insert();
}
else if(strcmp(order,"double")==0){
Double();
}
else if(strcmp(order,"delete")==0){
Delete();
}
else if(strcmp(order,"change")==0){
Change();
}
else if(strcmp(order,"reverse")==0){
Reverse();
}
else if(strcmp(order,"rotate")==0){
Rotate();
}
}
}
return 0;
}
F题,美丽的花环,计算几何。没有怎么搞过计算几何,所以,没有什么想法。题解:
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double pi=3.1415926;
double area(double x1,double y1,double R,double x2,double y2,double r){
double d=sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
if(d>R+r) return 0;
double area1=pi*R*R,area2=pi*r*r;
if(d<=fabs(R-r)) return min(area1,area2);
double p=(R+r+d)/2;
double Triarea=sqrt(p*(p-R)*(p-r)*(p-d));
// double angle1=asin(2*Triarea/(R*d));注意在这儿错了很久.
// double angle2=asin(2*Triarea/(r*d));主要就是asin和acos的取值范围.
double angle1=acos((R*R+d*d-r*r)/(2*R*d));
double angle2=acos((r*r+d*d-R*R)/(2*r*d));
double Sector1=angle1/pi*area1;
double Sector2=angle2/pi*area2;
return fabs(Sector1+Sector2-2*Triarea);
}
int main(){
// freopen("1.txt","r",stdin);
double x1,y1,R,r,x2,y2,K;
while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&R,&r,&x2,&y2,&K)){
double lager=area(x1,y1,R,x2,y2,K);
double small=area(x1,y1,r,x2,y2,K);
printf("%.2lf\n",fabs(lager-small));
}
return 0;
}