牛客算法周周练7

http://www.yyycode.cn/index.php/2020/05/19/%e7%89%9b%e5%ae%a2%e7%ae%97%e6%b3%95%e5%91%a8%e5%91%a8%e7%bb%837/


收集纸片

链接:https://ac.nowcoder.com/acm/contest/5713/A
来源:牛客网

我们把房间按照笛卡尔坐标系进行建模之后,每个点就有了一个坐标。 假设现在房子里有些纸片需要被收集,收集完纸片你还要回归到原来的位置,你需要制定一个策略来使得自己行走的距离最短。 你只能沿着 x 轴或 y 轴方向移动,从位置 (i,j) 移动到相邻位置 (i+1,j),(i-1,j),(i,j+1) 或 (i,j-1) 距离增加 1。

输入描述:

在第一行中给出一个T,1≤T≤10T, 1 \le T \le 10T,1≤T≤10, 代表测试数据的组数。对于每组输入,在第一行中给出房间大小,第二行给出你的初始位置。接下来给出一个正整数 n,1≤n≤10n,1 \le n \le 10n,1≤n≤10 代表纸片的个数。接下来 n 行,每行一个坐标代表纸片的位置。保证房间小于 20×2020 \times 2020×20,纸片一定位于房间内。

输出描述:

对于每组输入,在一行中输出答案。格式参见样例。

示例1

输入

复制 1 10 10 1 1 4 2 3 5 5 9 4 6 5

1
10 10
1 1
4
2 3
5 5
9 4
6 5

输出

复制 The shortest path has length 24

The shortest path has length 24

思路:先dfs走出从起点到终点的最短路,然后记下这个终点,加上终点到起点的距离。

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5;
typedef long long LL;
LL vis[maxn];
struct P{
	LL x;LL y;LL num;
}p[maxn];
LL res=0x3f3f3f3f;
LL n;
LL fx;LL fy;
void dfs(LL x,LL y,LL number,LL distance)//number表示枚举了几个 
{
	if(distance>=res) return;
	
	if(number>=n) 
	{
		res=min(res,distance);
		fx=x;fy=y;
		return;	
	}
	for(LL i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			dfs(p[i].x,p[i].y,number+1,distance+abs(p[i].x-x )+abs(p[i].y-y));
			vis[i]=0;
		}
	}
	
}
int main(void)
{
	LL t;cin>>t;
	while(t--)
	{
	 
         LL hx,hy;cin>>hx>>hy;
		 LL sx,sy;cin>>sx>>sy;
         cin>>n;
		 for(LL i=1;i<=n;i++) {cin>>p[i].x>>p[i].y;p[i].num=i;}
		 //起点0编号 
         vis[0]=1;
		 dfs(sx,sy,0,0);
		 cout<<"The shortest path has length "<<(res+abs(fx-sx)+abs(fy-sy))<<endl;
	}

return 0;
}

数字比较

链接:https://ac.nowcoder.com/acm/contest/5713/E
来源:牛客网

牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。

由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出”>”,小于则输出”<“,等于则输出”=”。

输入描述:

两个数字x和y。满足1 <= x,y <= 109

输出描述:

一个字符,">","<"或者"="。

示例1

输入

复制 2 2

2 2

输出

复制 =

=

示例2

输入

复制 2 4

2 4

输出

复制 =

=

思路:第一眼看到这个题就是高中的基础题……然后前头老师讲无穷级数的时候也复习了幂指函数

如果x^y>y^x的话,那么ln(x^y)>ln(y^x),ln()这个函数是单调递增的,这个数据范围都是>=0的,所以是满足的。那么根据性质可以把指数拉下来,就变成y*ln(x)>x*ln(y).那么我们就可以判断了

另外顺便复习下高中知识。我们把式子转化,变成lnx/x>lny/y;可以构造一个lnt/t的函数,对这个函数求导,我们可以画出这个函数的图像, 定义域在[1,∞), [1,e]上递增,[e,∞)上递减,在e处取极大值为1/e,同时x=2和x=4的时候函数值是一样的。再往深里出题,可以出一个极值点偏移问题…(逃我早就不是高中生了不会写了

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5;
typedef long long LL;

int main(void)
{
    LL x,y;cin>>x>>y;
     double a=y*log(x),b=x*log(y);
    if(a>b) cout<<">"<<endl;
    else if(a==b) cout<<"="<<endl;
    else cout<<"<"<<endl;
  
   return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/106223860