nyist 220 推桌子
题目链接:推桌子
题目意思:给你一些操作,将S出的桌子推到L出,但是这个过道有时会被占用,推一次是10min,不影响的操作可以同时开始,并且只记一次。
思路:贪心,首先按照S从小到大排序,决策:从第一个开始找最长的一条可以同时进行的操作,循环操作。
易错点:1 这里的操作不是一定 S> L的 会有L< S
2 给你一个例子就知道了, 1 3
4 5 这个操作的时候这个正确的应该是20,为什么,自己看图就知道了
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef struct numb { int l,r; }numb; numb a[205]; bool fun(numb x,numb y) { return x.l < y.l ? true:false; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); int i; memset(a,0,sizeof(a)); for(i = 0; i < n; i++) { scanf("%d%d",&a[i].l,&a[i].r); if(a[i].l > a[i].r) { int ans = a[i].l; a[i].l = a[i].r; a[i].r = ans; } } sort(a,a+n,fun); int t = 0; int max = 0; int j = 0; int flag = 1; while(flag) { for(j = 0; j < n; ++j) {if(a[j].l != 0) { max = a[j].r; a[j].l = 0; a[j].r = 0; break; } if( j+1 == n) { flag = 0; break; } } if(!flag) break; t++; for(i = j+1; i < n; i++) { if(max %2 == 1) { if(a[i].l > max +1) { max = a[i].r; a[i].l = 0; a[i].r = 0; } } else if(a[i].l > max) { max = a[i].r; a[i].l = 0; a[i].r = 0; } } } printf("%d\n",t*10); } return 0; }
yy_room