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