题目链接在此
最主要是想明白上上下下的人其实使可以互相“穿越的”,而且可以不用在人和人之间传递箱子。
我的代码里有自认为比较详细的注释,可以参考。
#include <stdio.h>
#include <algorithm>
using namespace std;
int T;
int N,F,B;
int init[1000];
int floor,box;
int ans;
int main(int argc, char *argv[]) {
scanf("%d",&T);
while ( T-- ) {
scanf("%d%d%d", &N, &F, &B);
for (int i=0; i<N; ++i) { // 一开始让所有人都搬过1个地上的箱子,记录所花的时间。
scanf("%d%d", &floor, &box);
if ( box==1 ) { // 拿箱子的人先上,再下去拿1个箱子,再上
init[i]=3*F-floor;
}
else { // 没拿箱子的人先下去拿1个箱子,再上
init[i]=F+floor;
}
}
sort(init, init+N); // 这里排的序,就是拿剩下的箱子的人的顺序。数值越大说明一开始越晚到达顶楼。
int left=B%N; // 搬最后一个箱子的人的排名,若整除就是最末尾那个人
if (left==0 ) { // 搬最后一个箱子的人是一开始最晚到达楼顶的人
// 这个人还有(B/N-1)个箱子要搬。他搬剩下的这些箱子花的时间,再加上他一开始所花的时间,就是总时间。其他人比他早结束。
ans=(B/N-1)*2*F+init[N-1];
}
else { // 搬最后一个箱子的人是数组下标为(left-1)的那个人。
// 这个人还有(B/N)个箱子要搬。他搬剩下的这些箱子花的时间,再加上他一开始所花的时间,就是总时间。其他人比他早结束。
ans=B/N*2*F+init[left-1];
}
printf("%d\n",ans);
}
return 0;
}