2021牛客暑期多校训练营2

**2021牛客暑期多校训练营2 **

C.Draw Grids

题意:给你一个nm的矩阵,里面有nm个点,每次选择2个点也就是|x1-x2|+|y1-y2|=1,其实就是相邻的2个点,在2个点之间画一条线,注意在连线的时候不能围成封闭图形,不能画的人输。
思路:我们可以发现,每个图形最多可以走一个S形。我们求出这个S形有n*m-1条边。然后直接判断即可
在这里插入图片描述
ac代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int num = n*m;
    num-=1;
    if(num%2==1)
        cout<<"YES";
    else 
        cout<<"NO";
    return 0;
}

D Er Ba Game

题意:两个人每人有2张牌,第一个人的牌用(a,b)(我们把点数小的放前面)表示,第二个人的牌用(c,d)(我们把点数小的放前面)表示,进行比大小,规则如下:
1:(2,8)这一对是最大的。
2:如果没有(2,8)点对,如果有一方的手牌是相同的两张牌是最大的。
比如a=b&&c!=d或者a!=b&&c=d;
3:如果两方的手牌都是一样的,比如a=b&&c=d,则会对第一张牌(a和c)进行比较
较大的一方赢。
4:如果是a!=b&&c!=d,则会对(a+b)%10和(c+d)%10进行比较,较大的一方赢。
5:如果是a!=b&&c!=d而且(a+b)%10和(c+d)%10相等的情况,则会对第二张牌(b和d)进行比较,较大的一方赢
思路:题目已经写的很清楚了,直接利用if语句进行判断即可。
ac代码:

#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define ll long long
#define int long long
#define orz main
using namespace std;
int n,m,k,x;
signed orz()
{
  int t;
  cin>>t;
  while(t--)
  {
      int a,b,c,d;
      cin>>a>>b>>c>>d;
      if(b<a)swap(a,b);
      if(d<c)swap(c,d);
      int f=0;
      if(a==c&&b==d)
      {
          f=0;
      }
      else if(a==2&&b==8)
      {
          f=1;
      }
      else if(c==2&&d==8)
      {
          f=2;
      }
      else if(a==b&&c!=d)
      {
          f=1;
      }
      else if(a!=b&&c==d)
      {
          f=2;
      }
      else if(a==b&&c==d)
      {
          if(a>c)f=1;
          else f=2;
      }
      else if(a!=b&&c!=d)
      {
          if((a+b)%10>(c+d)%10)f=1;
          else if((a+b)%10<(c+d)%10)f=2;
          else if((a+b)%10==(c+d)%10)
          {
              if(b>d)f=1;
              else if(b<d)f=2;
              else f=0;
          }
      }
      if(f==0)cout<<"tie"<<endl;
      else if(f==1)cout<<"first"<<endl;
      else cout<<"second"<<endl;
  }
    return 0;
}

注意各个情况之间的优先级即可。

F.Girlfriend

在这里插入图片描述
思路:
在这里插入图片描述
ac代码:

#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define ll long long
#define int long long
#define orz main
using namespace std;
double x[5],y[5],z[5];
signed orz()
{
    ios::sync_with_stdio(0);
  int t;
  cin>>t;
  while(t--)
  {
      for(int i=1;i<=4;i++)
      {
          cin>>x[i]>>y[i]>>z[i];
      }
      double k1,k2;
      cin>>k1>>k2;
      double pi=acos(-1);
      //根据待定系数法即可
      //球1:
      double dx=(k1*k1*x[2]-x[1])/(k1*k1-1);
      double dy=(k1*k1*y[2]-y[1])/(k1*k1-1);
      double dz=(k1*k1*z[2]-z[1])/(k1*k1-1);
      double r1=sqrt(dx*dx+dy*dy+dz*dz-(k1*k1*((x[2]*x[2])+(y[2]*y[2])+(z[2]*z[2]))-x[1]*x[1]-y[1]*y[1]-z[1]*z[1])/(k1*k1-1));
      //球2:
      double dx1=(k2*k2*x[4]-x[3])/(k2*k2-1);
      double dy1=(k2*k2*y[4]-y[3])/(k2*k2-1);
      double dz1=(k2*k2*z[4]-z[3])/(k2*k2-1);
      double r2=sqrt(dx1*dx1+dy1*dy1+dz1*dz1-(k2*k2*((x[4]*x[4])+(y[4]*y[4])+(z[4]*z[4]))-x[3]*x[3]-y[3]*y[3]-z[3]*z[3])/(k2*k2-1));
      double dis=sqrt((dx-dx1)*(dx-dx1)+(dy-dy1)*(dy-dy1)+(dz-dz1)*(dz-dz1));   //球心距离
      double ans=0;

    //相离或相切
    if(dis>=r1+r2){
        ans=0;
    }
    //内含或内切
    else if (dis+r1<=r2){
        ans=(4.00/3.00)*pi*r1*r1*r1;
    }
    else if(dis+r2<=r1){
        ans=(4.00/3.00)*pi*r2*r2*r2;
    }
    //相交
    else{
        //计算cos1
        double cal=(r1*r1+dis*dis-r2*r2)/(2.00*dis*r1);
        //计算h1
        double h1=r1*(1-cal);
        //计算球缺1体积
        ans+=(1.00/3.00)*pi*(3.00*r1-h1)*h1*h1;
        //计算cos2
        cal=(r2*r2+dis*dis-r1*r1)/(2.00*dis*r2);
        //计算h2
       double  h2=r2*(1.00-cal);
        //计算球缺2体积
        ans+=(1.00/3.00)*pi*(3.00*r2-h2)*h2*h2;
    }
    printf("%.3f\n",ans);
  }
    return 0;
}

I.Penguins

题意:2个20*20的图,左边那个人从(20,20)走到(1,20)。右边那个人从(20,1)走到(1,1)。#代表障碍物 .代表可以走。
找出一个字典序最小的行走路线,就算其中一个人到达了终点,也要跟着另外一个人移动。
L : 左边的人往左一步。右边的人往右走一步
R : 左边的人往右走一步,右边的人往左走一步
U :两个人往上走
D : 两个人往下走
注意:当移动时出界或者碰上障碍物会不移动。
思路:典型的BFS,用一个bool数组把之前走过的位置去掉,每一步枚举上下左右四个方向。结构体中存储x1,y1,x2,y2,选择走的方式S.当2个人的位置到达时,把选择的方式s在图里走一遍输出图就行。
ac代码:

#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define ll long long
#define int long long
#define orz main
using namespace std;
char mp1[25][25],mp2[25][25];
struct node
{
    int x1,y1,x2,y2,step;
    string s;
};
int xx1[5]={0,1,0,0,-1};
int yy1[5]={0,0,-1,1,0};
int xx2[5]={0,1,0,0,-1};
int yy2[5]={0,0,1,-1,0};
bool f[25][25][25][25];

queue<node>q;
signed orz()
{
    ios::sync_with_stdio(0);
     for(int i=1;i<=20;i++)
     {
         cin>>mp1[i]+1;
         cin>>mp2[i]+1;
     }
     q.push({20,20,20,1,0,""});
     f[20][20][20][1]=1;
     while(q.size())
     {
         node temp=q.front();
         q.pop();
         int x1=temp.x1,y1=temp.y1,x2=temp.x2,y2=temp.y2,step=temp.step;
         string s=temp.s;

         if(x1==1&&y1==20&&x2==1&&y2==1)
         {
             cout<<step<<endl;
             cout<<s<<endl;
             x1=20;y1=20;x2=20;y2=1;
             mp1[x1][y1]='A';
             mp2[x2][y2]='A';
             for(int i=0;i<s.size();i++)
             {
                 if(s[i]=='L')
                 {
                    if(y1-1>=1&&mp1[x1][y1-1]!='#') y1-=1;
                    if(mp1[x1][y1]!='#')mp1[x1][y1]='A';
                    if(y2+1<=20&&mp2[x2][y2+1]!='#')y2+=1;
                    if(mp2[x2][y2]!='#')mp2[x2][y2]='A';
                 }
                 if(s[i]=='R')
                 {
                     if(y1+1<=20&&mp1[x1][y1+1]!='#') y1+=1;
                    if(mp1[x1][y1]!='#')mp1[x1][y1]='A';
                    if(y2-1>=1&&mp2[x2][y2-1]!='#')y2-=1;
                    if(mp2[x2][y2]!='#')mp2[x2][y2]='A';
                 }
                 if(s[i]=='U')
                 {
                     if(x1-1>=1&&mp1[x1-1][y1]!='#')x1-=1;
                     if(mp1[x1][y1]!='#')mp1[x1][y1]='A';
                     if(x2-1>=1&&mp2[x2-1][y2]!='#')x2-=1;
                      if(mp2[x2][y2]!='#')mp2[x2][y2]='A';
                 }
                 if(s[i]=='D')
                 {
                     if(x1+1<=20&&mp1[x1+1][y1]!='#')x1+=1;
                     if(mp1[x1][y1]!='#')mp1[x1][y1]='A';
                     if(x2+1<=20&&mp2[x2+1][y2]!='#')x2+=1;
                      if(mp2[x2][y2]!='#')mp2[x2][y2]='A';
                 }
             }
             for(int i=1;i<=20;i++)
             {
                 for(int j=1;j<=20;j++)cout<<mp1[i][j];
                 cout<<" ";
                 for(int j=1;j<=20;j++)cout<<mp2[i][j];
                 cout<<endl;
             }
             return 0;
         }
         for(int i=1;i<=4;i++)
         {
             int dx1=x1+xx1[i];
             int dy1=y1+yy1[i];
             int dx2=x2+xx2[i];
             int dy2=y2+yy2[i];
             int dstep=step+1;
             string ds=s;
             if(i==1)
             {
                ds+='D';
             }
             else if(i==2)
             {
                 ds+='L';
             }
             else if(i==3)
             {
                 ds+='R';
             }
             else if(i==4)
             {
                 ds+='U';
             }
             if(dx1>=1&&dx1<=20&&dy1>=1&&dy1<=20&&mp1[dx1][dy1]=='.')
             {

             }
             else
             {
                dx1=x1;
                dy1=y1;
             }
             if(dx2>=1&&dx2<=20&&dy2>=1&&dy2<=20&&mp2[dx2][dy2]=='.')
             {

             }
             else
             {
                dx2=x2;
                dy2=y2;
             }

             if(f[dx1][dy1][dx2][dy2]==0&&((x1>=1&&dx1<=20&&dy1>=1&&dy1<=20&&mp1[dx1][dy1]=='.')||(dx2>=1&&dx2<=20&&dy2>=1&&dy2<=20&&mp1[dx2][dy2]=='.')))
             {
                 q.push({dx1,dy1,dx2,dy2,dstep,ds});
                 f[dx1][dy1][dx2][dy2]=1;
             }

         }
     }
     /*
     #................... .............##...#.
.................... .......#.....#.....#
.........#...#.#.... ...#....#...........
#........#.......... ...#..#.............
........#......#.... ..#.#......#.#.....#
......#.#..#.#....#. .......##.....##...#
....#...........#..# ....................
.##................. ...........#..#...#.
.....#.#........#.#. #.........#.#.......
.................... ..#....#..........#.
....#.#..........#.. .#.........#..#..#..
.........#.......#.. ..#.................
...#..#......#...#.. ......#.............
...........#...#.... ....................
..##..#.#....#..#... ..............#...#.
.#..#...#.#.....##.. .........#.#...#....
.#.........#........ ..............#.#...
..##.#........#...#. ##..................
....##.#............ .......#.....#......
..........##........ .#..#.#...........#.
     */
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值