收集紙片
鏈接: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;
}