牛客算法週週練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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章