标签:初始 field 游戏 rev div 相同 计算 col output
题意:给n个区间,你需要依次经过每一个区间,初始位置任选,每次可以移动一步或者两步。问最少需要移动多少次。
题解:在输入的时候依次对有重合部分的区间进行合并,如果最后合并完之后只有一个区间那么初始位置你选这个区间内任意一点你就可以不用移动。当合并后区间数大于1时,下一个区间不是在上一个区间的左边就一定在它右边,我们可以根据第二个区间与第一个区间的位置关系决定初始位置为第一个区间的左端点还是右端点。又因为可以跳一步或者两步,那么你需要判断最后一步是跳一步更优还是两步更优。如果要跳的距离是偶数或者跳到的区间长度为1,显然只能有一种跳法。否则,你就可以往你跳的方向再移动一格,此时我们可以做个标记,如果下一次跳和这一次跳的方向相同那我们就将上一次跳到的点进行移动再计算移动次数。
代码:
#include <bits/stdc++.h> using namespace std; const int N = 1000 + 10; int a[N],b[N]; int main() { int T,n; for (scanf("%d",&T);T--;) { scanf("%d",&n); for (int i = 0; i < n; i++) scanf("%d%d",&a[i],&b[i]); int l = a[0],r = b[0],i; for (i = 1; i < n; i++) { int L = max(l,a[i]); int R = min(r,b[i]); if (L > R) break; l = L; r = R; } if (i == n) { printf("0\n"); continue; } int fg = 0,ans = 0,x; if (b[i] < l) x = l; else x = r; for (; i < n-1; i++) { if (x > b[i]) { if (fg == -1) x--; ans += (x-b[i]+1)/2; if ((x-b[i])%2 == 1 && b[i] - a[i] > 0 ) fg = -1; else fg = 0; x = b[i]; }else if (x < a[i]) { if (fg == 1) x++; ans +=(a[i] - x + 1) /2; if ((a[i]-x)%2 == 1 && b[i] - a[i] > 0 ) fg = 1; else fg = 0; x = a[i]; } } if (x > b[i]) { if (fg == -1) x--; ans += (x-b[i]+1)/2; }else if (x < a[i]) { if (fg == 1) x++; ans +=(a[i] - x + 1) /2; } printf("%d\n",ans); } return 0; }
标签:初始 field 游戏 rev div 相同 计算 col output
原文地址:https://www.cnblogs.com/l999q/p/11407056.html