cc 還非常喜歡探索世界,他給了你一張 n×nn \times nn×n 的地形圖,希望從 (1,1)(1,1)(1,1) 點到達 (n,n)(n,n)(n,n) 點。
cc 可以從當前位置上下左右移動到達相鄰格仔,但 cc 不喜歡多餘的運動,他希望行走路線盡可能平坦。(路線平坦度的定義為路線中海拔最高點與最低點之差)
請你幫 cc 計算出一條最平坦的路線的平坦度。
2
21 2
2 14
1 8 7 9
1 1 1 1
2 2 2 1
9 7 6 1
一定要用二分+ 列舉上下界寫。。解題報告:
直接做不好統計,不妨反過來做。
o(2002)o(200^2)o(2002) 列舉上下界限,然後在原圖上跑 bfs 判斷
更優秀的做法是列舉下界,二分上界,可以把複雜度降為 o(200log200k)o(200log200 k)o(200log200k)
比標程更優秀的方法是二分答案,然後列舉下界去跑 bfs
自己想的最短路是錯的。。
#include
using
namespace
std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define mp make_pair
#define ull unsigned long long
#define ll long long
#define inf 0x3f3f3f3f
#define md ((ll+rr)>>1)
#define ls (i<<1)
#define rs (ls|1)
#define eps 1e-5
#define n 200
#define ree freopen("in.txt","r",stdin);
#define bug pf("----------------");
typedef pair pii;
//2023年08月31日08:38:57
int n;
int a[n][n];
bool vis[n][n];
int dx[4]=;
int dy[4]=;
//inline int min(int a,int b)
bool dfs(int mi,int ma,int x,int y)
return
false;
}bool bfs(int mi,int ma,int aa,int bb)
vis[aa][bb]=true;
while(!q.empty())
}return
false;
}int ans;
bool judge(int mid)
return
false;
}void find(int l,int r)
}int main() }
ans=inf;
find(abs(a[1][1]-a[n][n]),ma-mi);
//for(int i=0;i<=a[1][1];++i)
//if(bfs(i,mid,1,1))
//else l=mid+1;
//}//if(cnt!=-1) ans=min(ans,cnt-i);
//}//for(int i=mi;i<=ma;++i)
//if(bfs(i,j,1,1))ans=min(ans,j-i);
//}//}
pf("%d\n",ans);
}}
暑期個人賽 第二場 A
時間限制 1000 ms 記憶體限制 65536 kb 丁神要去google上班了,去之前丁神想再做一道水題,但時間不多了,所以他希望題目做起來既水又快。現在一共有 n 道題,編號從1到 n 每道題有兩個值 a 和 b a 為做這道題需要的時間,b 為題目的 水值 丁神希望做b a 最大的那題。輸入...
暑期個人賽 第二場 C
時間限制 1000 ms 記憶體限制 65536 kb 現有一段橫向長度為n的山脈,其中每段有乙個獨一無二的高度hi 1到n之間的正整數 現在你想知道對於長度為n的山脈,可能有這樣的山脈多少種。這樣的山脈是 某個位置要麼比兩邊的高度都低,要麼比兩邊的高度都高。兩座山脈 a和 b 不同當且僅當存在乙個...
個人賽 A 題 傳球遊戲(ball)
description 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,...