• [Codeforces] #432 div.2 (Virtual)


    = =自觉太颓,模拟赛 #432

    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)

     

    A - Arpa and a research in Mexican wave

    这个就真的太...
    有点像火车过隧道,随手一个AC

    B - Arpa and an exam about geometry

    计算几何瞎暴力qwq
    结果17次提交被5个点分别卡住
    显然如果满足两个条件:不共线,AB == BC 就行了
    但是计算有问题
    某Cho卡在精度上卡了一小时,,,
    = =
    显然,如果是Test 40:
    0 0 1000000000 1 1000000000 -999999999
    
    这种数据double没法保存所有精度
    所以经过翻阅某蓝名的代码:原来不用开方的qwq
    也就是说,直接判断 ((ax-bx)*(ax-bx)+(ay-by)*(ay-by)) == ((bx-cx)*(bx-cx)+(by-cy)*(by-cy)) 即可
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstdlib>
     5 using namespace std;
     6 
     7 double equ = 0.000000000001;
     8 
     9 bool getdis(long long ax,long long ay,long long bx,long long by,long long cx,long long cy){
    10 //    if(ax < bx) swap(ax,bx);
    11 //    if(ay < by) swap(ay,by);
    12     return (((ax-bx)*(ax-bx)+(ay-by)*(ay-by)) == ((bx-cx)*(bx-cx)+(by-cy)*(by-cy)));
    13 }
    14 
    15 bool eu(double A,double B){
    16     if(A < B) swap(A,B);
    17     double cnt = A-B;
    18     return cnt < equ;
    19 }
    20 
    21 bool line(long long ax,long long ay,long long bx,long long by,long long cx,long long cy){
    22     if((ax == bx && ax == cx) || (ay == by && ay == cy)) return true;
    23     if(ax == bx || ay == by || ax == cx || ay == cy || ax == cx || ay == cy) return false;
    24     return eu(1.0*(ax-bx)/(ay-by),1.0*(ax-cx)/(ay-cy));
    25 }
    26 
    27 int main(){
    28     long long ax,ay,bx,by,cx,cy;
    29     scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&ax,&ay,&bx,&by,&cx,&cy);
    30     
    31     if((ax == bx && ay == by) || (ax == cx && ay == cy) || (bx == cx && by == cy)){
    32         cout << "No";
    33         return 0;
    34     }
    35 //    printf("%lf %lf
    ",DisAB,DisBC);
    36 //    if(eu(DisAB,DisBC)) printf("A ");
    37 //    if(!line(ax,ay,bx,by,cx,cy)) printf("C ");
    38     if(getdis(ax,ay,bx,by,cx,cy) && !line(ax,ay,bx,by,cx,cy)) printf("Yes");
    39     else printf("No"); 
    40     
    41     return 0;
    42 }
    = =

     C - Five Dimensional Points

    题意:给你一堆五维点,求出点的数量以及点的列表,这些点符合这样的条件-- 每一个点和其他所有点中的两个点所连成的向量之间形成的是钝角,所有维度

    题目非常良心,连计算反余弦的公式都给了

    给了又如何,不还是WA

    = =解析几何没学好被打了

    根据题解我们知道:对于每三个点,我们只考虑一个以其中一个点为原点的平面

    因此显然:那两个向量在这个平面里一定是在不同的象限

    题解感觉也就提供了这个思路

    那么还是翻了波代码

    看到一个跟官方题解从理论层面神似的代码

    是这样的:对于待考虑点,检验点1,检验点2

    显然在一个平面内两个向量夹角大于 90°

    那么根据平面向量的知识我们知道:

    x1 x2+y1 y2 < 0

    此时两个向量所成角为钝角

    那么其中的 x y 其实也就是两维的标量,将其扩展到五维即可

    那么只要每一维的点积都是 < 0 ,其总和也必 < 0

     1 #include<cstdio>
     2 #include<iostream>
     3 #define maxn 2000
     4 using namespace std;
     5 
     6 int inc[maxn][5];
     7 
     8 int n,bad[maxn],num;
     9 
    10 int conclude(int a,int b,int c){
    11     int ret = 0;
    12     for(int i = 0;i < 5;i++) ret += (inc[a][i]-inc[b][i])*(inc[c][i]-inc[b][i]);
    13     return ret;
    14 }
    15 
    16 int main(){
    17     scanf("%d",&n);
    18     num = n;
    19     for(int i = 1;i <= n;i++)
    20         for(int j = 0;j < 5;j++)
    21             scanf("%d",&inc[i][j]);
    22 
    23     for(int k = 1;k <= n;k++)
    24         for(int i = 1;i <= n;i++)
    25             for(int j = 1;j <= n;j++)
    26                 if(k != i && i != j && k != j && conclude(i,k,j) > 0) bad[k] = 1,num--,i = n,j = n;
    27                 
    28     cout << num << endl;
    29     for(int i = 1;i <= n;i++) if(!bad[i]) cout << i << ' ';
    30 
    31     return 0;
    32 }
    = =
  • 相关阅读:
    两个错误的解决方案
    利用BeautifulSoup爬去我爱我家的租房数据
    使用Docker安装PaddlePaddle安装过程中出现的几个问题
    将博客搬至CSDN
    iOS---实现在屏幕上实时绘图的简单效果---CAShaperLayer和UIBezierPath的简单运用
    举例理解Hibernate的三种状态(转)
    关于hibernate5的映射文件和配置文件改变(转)
    数据库事务四种隔离级别
    使用idea构建Hibernate5项目
    手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7611488.html
Copyright © 2020-2023  润新知