水题
T1
Arpa and a research in Mexican wave CodeForces - 851A
1 #include<cstdio> 2 int n,k,t; 3 int main() 4 { 5 scanf("%d%d%d",&n,&k,&t); 6 if(t>=k&&t<=n) 7 printf("%d",k); 8 else if(t<k) 9 printf("%d",t); 10 else printf("%d",n+k-t); 11 return 0; 12 }
T2
Arpa and an exam about geometry CodeForces - 851B
翻译:存在一个点O,使得∠AOB=∠BOC且AO=BO=CO
推理:首先做ABC的外接圆O,如果要使∠AOB=∠BOC,那么△AOB≌△BOC,那么AB=BC
曾经犯过的严重错误:忽略了精度问题。事实上将近一亿的范围long double都不够,更何况这种题的数据应该有卡精度的。
解决方法:简单的等式变换,去掉实数运算。
曾经犯过的错误2:审题不清
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 //long double a1,a2,b1,b2,c1,c2,d1,d3;直接用double精度不够 5 //因为是求sqrt是否相等,实际可以不sqrt 6 long long d1,d3,a1,a2,b1,b2,c1,c2; 7 //double d2,d4;//(b1-a1)/(b2-a2)==(c1-b1)/(c2-b2) 8 int main() 9 { 10 scanf("%lld%lld%lld%lld%lld%lld",&a1,&a2,&b1,&b2,&c1,&c2); 11 //d2=(b1-a1)/(b2-a2); 12 //d4=(c1-b1)/(c2-b2); 13 if((b1-a1)*(c2-b2)==(b2-a2)*(c1-b1)) 14 { 15 printf("NO"); 16 return 0; 17 } 18 d1=(b1-a1)*(b1-a1)+(b2-a2)*(b2-a2); 19 //d2=sqrt((c1-a1)*(c1-a1)+(c2-a2)*(c2-a2)); 20 d3=(c1-b1)*(c1-b1)+(c2-b2)*(c2-b2); 21 if(d1==d3)//曾经错在:文中指定了是a转到b,b转到c,不是任意转 22 printf("YES"); 23 else 24 printf("NO"); 25 return 0; 26 }
T3
Five Dimensional Points CodeForces - 851C
主要难度在于理解题意。
给定n个五维空间中点的坐标(都为(i1,i2,i3,i4,i5)),由两点a和b定义的向量的坐标就是(b1-a1,b2-a2,b3-a3,b4-a4,b5-a5)。向量 与的夹角定义为 ,(xi表示向量x的第i个坐标,yi表示向量y的第i个坐标),。对于点a,如果存在点b和点c,使得点a、b、c互不相同,且和的夹角严格小于90°(用弧度制就是严格小于π/2),那么这个点就是坏的,否则这个点就是好的。计算n个点中好点的数目和序号。
方法:O(n³)暴力
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 using namespace std; 5 int a[1010][6]; 6 int xl[1010][1010][6]; 7 double len[1010][1010]; 8 const double pi2=acos(-1)/2; 9 double t2[1010][1010]; 10 bool bad[1010]; 11 int n,ans; 12 int main() 13 { 14 int i,j,k,j1,t; 15 double t2; 16 scanf("%d",&n); 17 for(i=1;i<=n;i++) 18 for(j=1;j<=5;j++) 19 scanf("%d",&a[i][j]); 20 for(i=1;i<=n;i++) 21 for(j=1;j<=n;j++) 22 { 23 if(i==j) continue; 24 for(j1=1;j1<=5;j1++) 25 xl[i][j][j1]=a[i][j1]-a[j][j1]; 26 for(j1=1;j1<=5;j1++) 27 len[i][j]+=xl[i][j][j1]*xl[i][j][j1]; 28 len[i][j]=sqrt(len[i][j]); 29 } 30 // for(i=1;i<=n;i++) 31 // for(j=i+1;j<=n;j++) 32 // { 33 // len[j][i]=len[i][j]; 34 // for(j1=1;j1<=5;j1++) 35 // xl[j][i][j1]=-xl[i][j][j1]; 36 // } 37 for(i=1;i<=n;i++) 38 { 39 for(j=1;j<=n;j++) 40 { 41 if(i==j) continue; 42 for(k=j+1;k<=n;k++) 43 { 44 if(i==k) continue; 45 t=0; 46 for(j1=1;j1<=5;j1++) 47 t+=xl[i][j][j1]*xl[i][k][j1]; 48 t2=acos((double)t/(len[i][j]*len[i][k])); 49 if(t2<pi2) 50 { 51 bad[i]=true; 52 goto aaa2; 53 } 54 } 55 } 56 aaa2: 57 ; 58 } 59 for(i=1;i<=n;i++) 60 if(bad[i]==false) 61 ans++; 62 printf("%d\n",ans); 63 for(i=1;i<=n;i++) 64 if(bad[i]==false) 65 printf("%d\n",i); 66 return 0; 67 }
T4
Polycarpus‘ Dice CodeForces - 534C
题意:给出一个n和A,再给出一个n个数的数列d1,d2,...,dn。有一个数列b1,b2,...,bn,i为任意1到n之间的整数时,都满足1<=b[i]<=d[i],且b1+b2+...+bn=A。输出n个数,第i个数表示bi可能取的值的数目(每个数分开考虑)。
方法:首先每个数最小取1,那么先将每个di减一,将A减去n(其实没必要,只是方便思考、计算)。对于bi,当其他数全部取0时可以取到最大(di);当其它数全部取最大值时可以取到最小(刚好使总和能够达到a)。当然,最大值不应该大于(新的)a,最小值不应该小于0。
1 #include<cstdio> 2 typedef long long LL; 3 LL b[200010]; 4 LL l,r,bad,sum,n,a; 5 int main() 6 { 7 int i; 8 scanf("%lld%lld",&n,&a); 9 a-=n; 10 for(i=1;i<=n;i++) 11 { 12 scanf("%lld",&b[i]); 13 b[i]--; 14 sum+=b[i]; 15 } 16 for(i=1;i<=n;i++) 17 { 18 l=0;r=b[i]; 19 if(a<b[i]) 20 r=a; 21 if(sum-b[i]<a) 22 l=a-sum+b[i]; 23 bad=b[i]-(r-l); 24 printf("%lld ",bad>0?bad:0); 25 } 26 return 0; 27 }
T5
Little Elephant and LCM CodeForces - 258C