AtCoder Beginner Contest 246 A~E 题解 Bishop 2

AtCoder Beginner Contest 246 A~E 题解

A Four Points

题意

给你矩形的三个顶点,输出剩下那个

思路

把横坐标和纵坐标分开,必会存在两个相同的数,横纵坐标就是剩下那个不同的数

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
typedef long long ll;
int X[10],Y[10];
int main(){
	for(int i = 0;i<3;i++){
		cin>>X[i]>>Y[i];
	}
	int x,y;
	if(X[0]==X[1]) x = X[2];
	else if(X[0]==X[2])x = X[1];
	else x = X[0];
	if(Y[0]==Y[1]) y = Y[2];
	else if(Y[0]==Y[2])y = Y[1];
	else y = Y[0];
	cout<<x<<" "<<y<<endl;
	return 0;
}

B - Get Closer

题意

给你一个方向向量(x,y),问你沿着这个方向移动1个单位,横纵坐标变化多少

思路

利用勾股定理求出斜边d,答案就是 x/d y/d

AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
typedef long long ll;
int main(){
	double  x,y;
	cin>>x>>y;
	double d = sqrt(x*x+y*y);
	printf("%.6lf %6lf",x/d,y/d);
	return 0;
}

C - Coupon

有N个商品,K张优惠卷,每张优惠卷X元,一张优惠卷只能用一次,一个商品可以用无限多张,直至价格变成0元,问花费最少的钱能买下N个商品

思路

用优先队列先尽量完整地使用优惠卷(即1张优惠值为X元),如果优惠后商品价值仍为正数,重新进入队列,如果优先队列的最大价值小于X元,再一张张使用优惠卷,变成0元,途中若优惠卷为0或者队列为空就退出
最后实际花费的钱就是剩下优先队列所有物品的价值和

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
typedef long long ll;
int A[N];
int main(){
	priority_queue<int> q;
	ll n,k,x;
	cin>>n>>k>>x;
	for(int i = 0;i<n;i++){
		cin>>A[i];
		q.push(A[i]);
	}
	ll use = 0;
	while(!q.empty()&&k>0){
		ll prime = q.top();
		q.pop();
		ll t = min(prime/x,k);
		if(t==0&&k>0) t = 1;
		prime -= t*x;
		k -= t;
		if(prime>0) q.push(prime); 
	} 
	while(!q.empty()){
		ll prime = q.top();
		q.pop();
		use += prime;
	}
	cout<<use<<endl;
	return 0;
}

D - 2-variable Function

给出N(N<1e18),查找最小的X满足1. 比N大 2 . 存在非负数(a,b) 令在这里插入图片描述

思路

显然,a,b都是小于1e6 的,那么我们枚举一个a,然后二分找b,使等式略大于N即可

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+7;
typedef long long unsigned ll;
int main(){
	ll ans = 1e19,n;
	cin>>n;
	for(ll i = 0;i<=N;i++){
		ll l = 0, r = N;
		while(r>l){
			ll m = (l+r)/2;
			if(i*i*i+i*i*m+i*m*m+m*m*m>=n) r = m;
			else l = m+1;
		}
		ans = min(ans,i*i*i+i*i*l+i*l*l+l*l*l);
	}
	cout<<ans<<endl;
	return 0;
}

E - Bishop 2

题意

跟走迷宫类似,从A点走到B点,某些点不能走,可以斜着走无限远,直到超出边界或者遇到障碍物,只算1步,问最少多少步从A 到B

思路

BFS 走迷宫,但是要注意的是在走四个方向的时候要沿着这个方向一直延展,如果说遇到边界或者遇到障碍物或者这个点已经走过了就退出延展。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
typedef long long ll;
int dir[4][2] = {1,1,-1,-1,1,-1,-1,1};
int G[2000][2000];
int ans[2000][2000];
int vis[2000][2000];
int n,bx,by,ex,ey; 
struct node {
	int x,y;
};
int bfs(){
	queue <node> q;
	q.push({bx,by});
	ans[bx][by] = 0;
	while(!q.empty()){
		int x = q.front().x;
		int y = q.front().y;
		q.pop();
		if(x==ex&&y==ey){
			return ans[x][y];
		}
		for(int i = 0;i<4;i++){
			for(int k = 1;;k++){
				int nx = x+k*dir[i][0];
				int ny = y+k*dir[i][1];
				if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&G[nx][ny]!=1&&ans[nx][ny]>=ans[x][y]+1){//关键在这里
					
						ans[nx][ny] = ans[x][y]+1;
						q.push({nx,ny}); 
					
				}
				else break;
			} 
		}
	}
	return -1;
} 
int main(){
	cin>>n>>bx>>by>>ex>>ey;
	for(int i = 1;i <=n ;i++){
		for(int j = 1;j<=n;j++){
			char ch;
			cin>>ch;
			ans[i][j] = 0x3f3f3f3f;
			if(ch=='.') G[i][j] = 0;
			else G[i][j] = 1;
		}
	}
	cout<<bfs()<<'\n'; 
	return 0;
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值