您的位置:首页 > 大数据 > 人工智能

pku 2772 up the stair 模拟推导 解题报告

2009-12-13 01:05 495 查看
pku 2772 up the stair 解题报告
假设有9个箱子,3个人,10层楼,
初始状态为:1在0,2在5有带箱子,3在3有带箱子.
模拟一下这过程:
第一个人运行:



第二个人运行:



第三个人运行:



那么可以发现总的时间由第二个人来决定的.即(10-5)*2+5 + 10 + 2 * 2 * 10.
我们假设c[i]为每人在初始点回到最底层所需要的时间.即c[i]=(初始位置+2*b(F-初始位置)). 很明显第二个送其中一个箱子所需要的时间为:F+c[i],而另外2个箱子则为2 * 2 * F.问题在于怎么求出这个2?以及i呢?细看一下:t=6/3*2*F。联系数据为(B-1)/N*2*F,而i为(B-1)%N.所以可得公式:time=((B - 1) / N) * 2 * F + (F + c[(B - 1) % N])。
AC代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}

int main()
{
freopen("upthestairs.in", "r", stdin);
int i, T, N, F, B, b, c[2323];

scanf("%d", &T);
for (; scanf("%d%d%d", &N, &F, &B), T--; )
{
int sum = 0;
//先将B--,用于在于腾出一个计算F+c[B%N]
for (i = 0; i < N; ++i)
{
scanf("%d%d",c + i, &b);
c[i] += 2 * b * (F - c[i]);
}
qsort(c, N, sizeof(c[0]), cmp);
printf("%d/n", ((B - 1) / N) * 2 * F + (F + c[(B - 1) % N]));

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: