http://acm.hdu.edu.cn/showproblem.php?pid=5037php
貪心,一個月沒作題了,這道題卡了半天0 0~spa
只要考慮清楚走兩個時,爲了保證最優,使得距離要是L+1,若是小於這個值,會致使能直接走到這裏,就不是最優了blog
題目要求最差狀況下青蛙走的最佳狀況,因此每次開始都使他只走1,而後走Nget
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 2e5 + 10; int main() { int N, M, L; int T; int a[MAXN]; scanf("%d", &T); int cas = 1; while(T--){ scanf("%d%d%d", &N, &M, &L); a[N+1] = M; for(int i = 1; i <= N; i++) scanf("%d", &a[i]); sort(a + 1 , a + N + 2); int pre = L, now = 0; int cnt = 0; int flag = 1; for(int i = 1; i <= N + 1; i++){ int len = a[i] - now; if(len == 0) continue; if(len + pre <= L){ pre = len + pre; now = a[i]; } else if(len <= L){ now = a[i]; pre = len; cnt++; } else{ // printf("%d %d\n", now, cnt); int k1, k2; k1 = len % (L+1); k2 = (len - k1)/(L+1); cnt += k2*2; if(k1 + pre <= L){ pre = k1 + pre; now = a[i]; } else { pre = k1; now = a[i]; cnt++; } } } printf("Case #%d: %d\n",cas++, cnt); } return 0; }