Contest - FJNU_2009系列赛五(月赛②)解题报告

Contest - FJNU_2009系列赛五(月赛②)解题报告

Problem A: Easy problem

对于ans+=a[i]&a[j], 实际上是加上sum{2^i}(0<=i<k && c[i] == 1)其中c[i] a[i]&a[j]用二进制表示时第i位的值,k代表a[i]&a[j]用二进制表示时共有几位

所以,我们可以统计所有输入的数,当它们用二进制表示时,第 i位为1时的次数,咱们用c[i]表示(注意此c[i]跟上面的c[i]意义不一样),观察到, 当某位出现的次数为n时,其加到ans上的次数应为n*n,由些可得

ans = sum{2^i*c[i]*c[i]}(0<=i<k) k表示这些数中用二进制表示时的最大位数.

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

偶是华丽的分割线嘎

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

Problem B: 圆柱堆问题

 

假设取1号做受力分析(只考虑上方对其的作用力),那么有

其实力l是由3号提供的,r是由2号提供的,其实lg,rg的夹角均为30度,我们假定一个柱体,受到斜向左的力为l,斜向下右的力为r,重力为w,a[i][j]代表第i行第j个圆柱体,那么有

a[i][j].l = a[i-1][j].l + a[i-1][j].w * sqrt(3) / 3

a[i][j].r = a[i-1][j-1].r + a[i-1][j-1].w * sqrt(3) / 3

a[i-1][j].w * sqrt(3) / 3为重力在对应的l或者r 方向的分力.

接下来考虑最后一行的柱体对左挡板的压力

对于最后一行的柱体,假设向左的力是正,向右是负,则其水平方向的合力为F[i]=(a[n][i].l-a[i][i].r)/2

现在我们从左至右考虑每根圆柱.每个圆柱产生的水平力非正即负或零,我们累加这个合力.假设存储为sum= ,其中,1<=i<=k,F[i]>0,现在考虑第k+1个圆柱.如果F[k+!]>0,那么显然,k+!个圆柱产生的合力也要被左挡板承受,sum+=F[k+!];反之,如果F[k+!]<0,k+1个圆柱产生的力是向右的,(我有向本题作者要过测试数据,测试数据就认为这时的sum值就是左挡板的压力),这里,我们再分两种情况:.k+1<=i<=n,如果F[i]<0,说明第k个圆柱后面的产生合力都是向右,那么这个压力是由右挡板承受的,左挡板所受的压力就是sum;,k+1个圆柱后面的圆柱存在某个合力仍然向左的圆柱(假设这个圆柱是第m个圆柱).这种情况下,k+1个圆柱到第m-1个圆柱产生向右的水平力会被该圆柱产生向左的水平力抵消一部分,甚至可能超过,这样两者产生的合力仍然是向左的,所以左挡板所受的压力要加上该值.分析到这里,我们不难看出,计算左挡板压力的方法: 从左至右,累加各个圆柱的合力,这个合力的最大值,就是左挡板所受的力.

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

又是华丽的分割线

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

Problem C: 液晶切割

注意到每次可以把一块矩形液晶水平或者竖直地切成两块,一开始没看到这个,把问题想复杂了许多,囧~~~~~

开一个二维数组dp[X][Y],dp[i][j]代表长为i宽为j的液晶块能切割能卖出的最多价钱,那么由于切割方式是水平或者竖直地切成两块,就有转换方程

dp[i][j] = Max{dp[i][j], dp[i-k][j]+dp[k][j]}(1<=k<=i/2)

dp[i][j] = Max{dp[i][j], dp[i][j-k]+dp[i][k]}(1<=k<=j/2)

dp[i][j]的初始值为如果有长度为x,宽为yC价钱的液晶,那么有dp[x][y] = dp[y][x] = C,因为数据没有严格按题目的要求给出(题目是说n种尺寸不一,且长大于宽的液晶),故可能出现如下数据

3 2 100

2 3 3

那么很明显我们的dp[3][2]dp[2][3]必须取100而不是3,即在赋值的时候要加一个判断if(dp[x][y]<C)才进行赋值,对于其他情况全部为dp[i][j]=0.

最终答案为dp[X][Y]X,Y为大液晶块的长和宽

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

粉华丽的分割线

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

Problem D: 取款

很简单的一道模拟题。

开辟一个大小为Ka数组代表K个营业员要工作到的时间

每读到一个客户,先把该客户的到达时间转换成秒S,然后找到这K个营业员工作的时间最短的a[i],然后a[i] = (Max(a[i],S) + 该客户业务所要办理的时间)

wzc到达时,按上面的方法求得a[i]后,判断a[i] 是否小于17*3600,即是否未到银行关闭时间,如果小于,则将a[i]转换为相应的时秒分格式,否则就输出Bad Luck!

由于每次要找到K个营业员的最短时间,可以将这K个数构造成一个最小堆,时时维护,不过对于此题,K <= 100,没啥必要-_-…….

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

持续华丽的分割线

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

Problem E: 椭圆容器问题

知识准备:

1.    椭圆面积公式:

S=πab    

这个公式要用到椭圆的参数方程,具体推导过程可以参阅任何一本<<高等数学>>或者<<数学分析>>中关于定积分的应用,(高等数学同济大学第六版上册276页例3)
2.
椭圆体体积公式:

V= 4/3πabc=

这个微积分公式是本题的关键,见下面的推导吧 .^_^.

   

 

我们只考虑上半球,假设有一个上半椭圆球容器(z>=0),装有若干水,水面高度为h.对于0<=z<=h,zz+dz将容器切为一个小片片,dz很小时,小片片的体积v’=S*dz,S是小片片的截面面积,其方程为 ,两边除以,:

其面积

 ,得到体元素为

 z的变化范围是[0,h],

你可能感兴趣的:(Contest - FJNU_2009系列赛五(月赛②)解题报告)