链接:http://soj.me/1193
这道题是老师要我们做的,只要把问题转化为,人们在楼梯上可以看成是相互穿越的,问题就好解决了~ 我的做法是用一个数组arr[1005]记录下所有人当前所在楼层,如果该人空手,则是所在楼层乘上-1,如空手下到五楼的人所在楼层是-5,让数组从大到小排序,然后维护一个数组,迭代一次就代表所有人都把东西卸货了,所以第一次迭代后的每一次数组都应该是一样的
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int n, f, b, t, cago, arr[1005]; bool cmp(int x, int y) { return x > y; } void ans() { int sb=0; while(++sb) { for(int i=0; i < n; ++i) { --cago; if(cago<=0) { t+=(f - arr[i]); return; } } t += f - arr[n-1]; if(sb==1) { for(int i = 0;i<n-1;++i) { arr[i]+=(f-arr[n-1]); if(arr[i]>=f) arr[i]-=2*f; } arr[n-1]=f * -1; } } } int main() { int a, tmp1, tmp2; cin>>a; while(a--) { memset(arr, 0, sizeof(arr)); t = 0; cin>>n>>f>>b; cago = b; for(int i = 0; i < n; ++i) { cin>>tmp1>>tmp2; if(tmp2==0) tmp1*=-1; else ++cago; arr[i] = tmp1; } sort(arr, arr + n, cmp); ans(); cout<<t<<endl; } return 0; }