2021牛客暑期多校训练营2

2021牛客暑期多校训练营2

C:Draw_Grids

解释

不能形成环,只能形成树,所以有nm个点,那就能连nm-1边。

代码

int n,m; cin>>n>>m;
int ans = n*m - 1; 
cout<<(ans % 2 ? "YES": "NO")<<endl;

D:Er_Ba_Game

解释

注意细节

代码

#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;

string s[3] = {"first","second","tie"};

signed main(){
    int tt; cin>>tt;
    while(tt --){
    	int a1,b1,a2,b2; cin>>a1>>b1>>a2>>b2;
    	if(a1 > b1) swap(a1,b1);
    	if(a2 > b2) swap(a2,b2);
    	if(a1 == 2 && b1 == 8){
    		if(a2 == 2 && b2 == 8) cout<<s[2]<<endl;
    		else cout<<s[0]<<endl;
		}else if(a2 == 2 && b2 == 8){
    		if(a1 == 2 && b1 == 8) cout<<s[2]<<endl;
    		else cout<<s[1]<<endl;
		}else if((a1 == b1  && a2 != b2) || (a2 == b2 && a1 != b1)){
			if(a1 == b1) cout<<s[0]<<endl;
			else cout<<s[1]<<endl;
		}else if(a1 == b1 && a2 == b2){
			if(a1 > a2) cout<<s[0]<<endl;
			else if(a2 > a1) cout<<s[1]<<endl;
			else cout<<s[2]<<endl;
		}else if(a1 != b1 && a2 != b2){
			if((a1 + b1) % 10 > (a2 + b2) % 10) cout<<s[0]<<endl;
			else if((a1 + b1) % 10 < (a2 + b2) % 10) cout<<s[1]<<endl;
			else{
				if(b1 > b2) cout<<s[0]<<endl;
				else if(b1 < b2) cout<<s[1]<<endl;
				else cout<<s[2]<<endl;
			}
		}
	}
	return 0;
}

F:Girlfriend

解释

不会阿氏圆就硬推圆心和半径,要知道球冠,球缺,之后就是两个球体积交的板子来源

代码

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);

struct point {
	double x, y, z;
	point() {}   // 构造函数
	point(double a, double b, double c) :x(a), y(b), z(c) {}
	void in() { cin >> x >> y >> z; }
};
inline point operator+(point a, point b) { return point(a.x + b.x, a.y + b.y, a.z + b.z); }
inline point operator-(point a, point b) { return point(a.x - b.x, a.y - b.y, a.z - b.z); }
inline point operator*(double k, point a){ return point(a.x * k, a.y * k, a.z * k); }   // 常数 k 乘以一个向量or点
inline double distance(point a) { return sqrt(a.x * a.x + a.y * a.y + a.z * a.z); }   // 点到原点的距离  distance(A-B)即是AB的距离

//用阿圆 得出球体的球心 和半径  AP/BP=k  传出O球心坐标 和R半径
//void getsphere(point A, point B,double k, point& O, double& R){
//	O = B + 1/ (k * k - 1)*(B-A);
//	R = k / (k * k - 1) * distance(A-B);
//}

#define Squ(x) ((x) * (x))

void getsphere(point a, point b,double k, point& O, double& R){
	k *= k;
	double down = 1 - k;
	double A = 2 * (k*b.x-a.x) / down;
	double B = 2 * (k*b.y-a.y) / down;
	double C = 2 * (k*b.z-a.z) / down;
	double D = (Squ(a.x)-k*Squ(b.x) + Squ(a.y)-k*Squ(b.y) + Squ(a.z)-k*Squ(b.z)) / down;
	O = {-A/2,-B/2,-C/2};
	R = sqrt((Squ(A)+Squ(B)+Squ(C)-4*D)/4.0);
}

// R是球的半径  H是球缺的高度
double Spherical_Cap(double R, double H){
	return PI * H * H * (R - H / 3.0);
}
// curved surface of spherical cap 球冠
double Cureer_Surface_Of_Spherical_Cap(double R, double H){
	return 2 * PI * R * H;
}
// 计算重叠球体体积大小
double Overlapping_volume_sphere(point A, double R1, point B, double R2) {
	double d = distance(A - B);
	if(d > R1 + R2) return 0;
	else if(d < fabs(R1 - R2)) {
		if(R1 < R2) swap(R1, R2);
		return R2*4.0/3 * PI * R2 * R2;
	}
	else{
		double h1 = R1 - (R1 * R1 + d * d - R2 * R2) / (2 * R1 * d) * R1; // 用余弦定理来算
		double h2 = R2 - (R2 * R2 + d * d - R1 * R1) / (2 * R2 * d) * R2;
		return Spherical_Cap(R1, h1) + Spherical_Cap(R2, h2);
	}
}

signed main(){
	IOS
    int tt; cin>>tt;
    while(tt --) {
		point A, B, C, D;
		A.in(), B.in(), C.in(), D.in();
		double k1, k2; cin >> k1 >> k2;
		point O1, O2;
		double R1, R2;
		getsphere(A, B, k1, O1, R1);
		getsphere(C, D, k2, O2, R2);
		double p = Overlapping_volume_sphere(O1, R1, O2, R2);
		cout << fixed << setprecision(3) << p << endl;
	}
	return 0;
}

G:League_of_Legends*

解释

代码

I:Penguins

解释

跑BFS,注意细节,没一个格子标记是要记录它是从哪个方向来的,边界或则障碍物都不前进。

代码

#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int N = 20 + 10;
const int mod = 1e9 + 7;
const double eps = 1e-9;
#define int long long

int dx[] = {1,0,0,-1};
int dy[] = {0,-1,1,0};
char dir[] = {'D','L','R','U'};
bool book[N][N][N][N][4];
string mpa[N],mpb[N];

struct Node{
	int x1,y1,x2,y2;
	string s;
};
string ans = "";
queue<Node> qe;

void bfs(){
	qe.push({20,20,20,1,""});
	while(!qe.empty()){
		Node t = qe.front();qe.pop();
		if(t.x1 == 1 && t.y1 == 20 && t.x2 == 1 && t.y2 == 1){
			ans = t.s;
			break;
		}
		for(int i=0;i<4;i++){
			int x1 = dx[i] + t.x1;
			int y1 = dy[i] + t.y1;
			int x2 = dx[i] + t.x2;
			int y2 = dy[i] + t.y2;
			if(i == 1 || i == 2){
				x2 = dx[3-i] + t.x2;
				y2 = dy[3-i] + t.y2;
			}
			if(x1 <= 0 || x1 > 20 || y1 <= 0 || y1 > 20 || mpa[x1-1][y1-1] == '#') x1 = t.x1,y1 = t.y1;
			if(x2 <= 0 || x2 > 20 || y2 <= 0 || y2 > 20 || mpb[x2-1][y2-1] == '#') x2 = t.x2,y2 = t.y2;
			
			if(book[x1][y1][x2][y2][i]) continue;
			book[x1][y1][x2][y2][i] = true;
			
			if(x1 != t.x1 || x2 != t.x2 || y1 != t.y1 || y2 != t.y2){
				qe.push({x1,y1,x2,y2,t.s+dir[i]});
			}
		}
	}
}

void slove(){
	int x1 = 20,y1  =20,x2 = 20,y2 = 1;
	mpa[x1-1][y1-1] = 'A',mpb[x2-1][y2-1] = 'A';
	for(int i=0;i<(int)ans.size();i++){
		char ch = ans[i];
		int k = 0;
		if(ch == 'D') k = 0;
		else if(ch == 'L') k = 1;
		else if(ch == 'R') k = 2;
		else k = 3;
		int xx1 = dx[k] + x1;
		int yy1 = dy[k] + y1;
		int xx2 = dx[k] + x2;
		int yy2 = dy[k] + y2;
		if(k == 1 || k == 2){
			xx2 = dx[3-k] + x2;
			yy2 = dy[3-k] + y2;
		}
		if(xx1 <= 0 || xx1 > 20 || yy1 <= 0 || yy1 > 20 || mpa[xx1-1][yy1-1] == '#') xx1 = x1,yy1 = y1;
		if(xx2 <= 0 || xx2 > 20 || yy2 <= 0 || yy2 > 20 || mpb[xx2-1][yy2-1] == '#') xx2 = x2,yy2 = y2;
		if(xx1 != x1 || yy1 != y1) mpa[xx1-1][yy1-1] = 'A';
		if(xx2 != x2 || yy2 != y2) mpb[xx2-1][yy2-1] = 'A';
		x1 = xx1,y1 = yy1;
		x2 = xx2,y2 = yy2;
	}
}

signed main(){
    for(int i=0;i<20;i++) cin>>mpa[i]>>mpb[i];
    bfs();
    cout<<(int)ans.size()<<endl;
    cout<<ans<<endl;
    slove();
    for(int i=0;i<20;i++) cout<<mpa[i]<<" "<<mpb[i]<<endl;
	return 0;
}

K:Stack

解释

代码

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;

int n,m;
int cnt[N],ne[N],ans[N],d[N];
bool plas = true;

void top_sort(){
	queue<int> qe;
	vector<int> ve;
	for(int i=1;i<=n;i++) if(!d[i]) qe.push(i);
	while(!qe.empty()){
		int t = qe.front();qe.pop();
		ve.push_back(t);
		int j = ne[t];
		if(--d[j] == 0) qe.push(j);
	}
	for(int i=0,j=n;i<n;i++,j--) ans[ve[i]] = j;
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
    cout<<endl;
}

signed main(){
	IOS
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	int a,b; cin>>a>>b;
    	cnt[a] = b;
    	if(b > a) plas = false;
	}
	if(!plas){
		cout<<-1<<endl;
		return 0;
	}
	stack<int> stk;
	stk.push(1);
    for(int i=2;i<=n;i++){
    	if((int)stk.size() > cnt[i]-1 && cnt[i]){
			int last = 0;
			while((int)stk.size() > cnt[i]-1){
				last = stk.top();
				stk.pop();
			}
			ne[last] = i;
			d[i] ++;
			if((int)stk.size()) d[stk.top()] --;
		}
		if((int)stk.size()) ne[i] = stk.top(),d[stk.top()] ++;
		stk.push(i);
	}
	top_sort();
    
	return 0;
}

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值