20170906

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170906相关的知识,希望对你有一定的参考价值。

水题

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 }
View Code

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:莫名奇妙的将判定a、b、c三点共线的方法当成了xa/ya==xb/yb==xc/yc,显然不对

曾经犯过的错误2:审题不清,文中指定了是a转到b,b转到c,不是任意转

 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

以上是关于20170906的主要内容,如果未能解决你的问题,请参考以下文章

20170906

20170906xlVBA_RecursionGetFiles

20170906xlVBA_CopyDataAndFormatFromSheets

校内集训(20170906)

20170906-多线程之ThreadLocal

20170906模拟赛