Gym 103055 The 18th Zhejiang Provincial Collegiate Programming Contest

Problem - A

        水题 直接求出和 比较大小就行了 不过这题我比赛时候很顺地写下来了 比赛完重新写的时候 又一直读错题目意思了 以为每个回合是扣自己的hp..好险 真的好险

#include<iostream>
int main()
{
    using namespace std;
    int a[5];
    int b[5];
    int sum1=0,sum2=0;
    for(int i=0;i<5;++i)
    {
        cin>>a[i];
        sum1+=a[i];
    }
    for(int i=0;i<5;++i)
    {
        cin>>b[i];
        sum2+=b[i];
    }
    if(sum1>=sum2)
        cout<<"Blue"<<endl;
    else
        cout<<"Red"<<endl;
}

Problem - C

题意:

        给八个顶点,判断这八个顶点能否构成正方体

思路:

        如果是一个正方体,我们从一个顶点出发,到其余七个顶点的距离分别是a,a,a,√2 a,√2 a,√2 a,√3 a,对于任意一个顶点出发,都会满足上述条件。

        我们可以把七个线段距离先算出来,然后进行排序,再进行比较,这样进行八个循环(即每个顶点都要作为起点算一次)如果有任意一个不符合条件就不是正方体。

注意:

        由于根号难以计算,我们在计算及比较的时候要把他们平方,即算两点间距离公式的时候不用再将整体根号了

        注意出现距离为0的情况,这样也能满足条件,但显然不是正方体。

代码:

#include<iostream>
#include<algorithm>
int main()
{
    using namespace std;
    int T;
    int p[8][3];//存放8个点
    int dis[8];//存放距离
    cin>>T;
    while(T--)
    {
        bool flag=true;
        for(int i=0;i<8;++i)
            for(int j=0;j<3;++j)
                cin>>p[i][j];//输入八个点
        for(int i=0;i<8;++i)//每一个顶点都要作为标准点算一次
        {
            for(int j=0;j<8;++j)
            {
                dis[j]=0;
                if(i==j)
                    continue;
                dis[j]=(p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1])+(p[i][2]-p[j][2])*(p[i][2]-p[j][2]);
            }
            sort(dis,dis+8);//注意这里dis[0]会是0 因为上面当i==j的时候 dis[j]会等于0 所以不参与下面的比较
//            for(int i=0;i<8;++i)
//                cout<<i<<' '<<dis[i]<<endl;
            if(dis[1]!=dis[2]||dis[2]!=dis[3]||2*dis[3]!=dis[4]||3*dis[4]!=2*dis[7])
                flag=false;
            if(dis[1]==0||dis[4]==0||dis[7]==0)//考虑有0的情况
                flag=false;
        }
        if(flag==true)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}

Problem - J 

Dijkstra+完全背包问题

        比赛的时候和队友讨论这题的时候就突然想到这是背包 但是我最短路还不是太熟练所以也没敢开  等过段时间都熟练了我再来

        ......

        应该会来叭

        如果一直没时间来的话希望以后成为超级厉害的程序员的时候 看到这题能立马随手敲出代码哈哈哈哈(已经在开心了

Problem - M

题意:

        老师与学生会互相给出1~20的分数,学生给分数的时候不知道老师的分数,但是会尽量使自己分数最大化。给出分数会失去相应分数。如果给出的分数比对方给的分数小,对方加10分,自己扣10分,反之就相反。输入班级人数,求老师最后的得分。

代码:(其实是队友的代码)

#include<iostream>
using namespace std;
int main()
{
    double sum=0;
    for(int i=1;i<=20;i++)
    {
        for(int j=1;j<=20;j++)
        {
            if(i==j)
                continue;
            else  if(i<j)
                sum+=0.05*(j-i-10);
            else
                sum+=0.05*(j-i+10);
        }
    }
    int n;
    cin >> n;
    if(n==1)
        cout << 0 <<endl;
    else
        cout << (n-1)*sum <<endl;
    return 0;
}

        emm自己不会数学 是什么 数学期望值 ??压根想不到啊救命 下面是别人的题解

        不禁再次夸夸我的队友 也很惊讶大家怎么都能想到这里 还是自己的问题吧

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值