**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;
}