bestcoder #14

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012860428/article/details/40249649

1001:

Harry And Physical Teacher

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 88    Accepted Submission(s): 66


Problem Description
As we all know, Harry Porter learns magic at Hogwarts School. However, learning magical knowledge alone is insufficient to become a great magician. Sometimes, Harry also has to gain knowledge from other certain subjects, such as language, mathematics, English, and even algorithm. 
Today, Harry's physical teacher set him a difficult problem: if a small ball moving with a speed V_0 made a completely elastic collision with a car moving towards the same direction with a speed V (V<V_0), and the car far outweighs the ball, what was the speed of the small ball after the collision?
This problem was so difficult that Harry hasn't figure out how to solve it. Therefore, he asks you for help. Could you do him this favor?
 

Input
They are several test cases, you should process to the end of file.
There are two integers V and V_0 for each test case. All the integers are 32-bit signed non-negative integers.
 

Output
For each test case, just output one line that contains an integer indicate the speed of the small ball after the collision.
 

Sample Input
0 10
 

Sample Output
-10
 

Source
 

物理水题(比赛时先补了下物理知识),运用动量守恒定律和能量守恒定律可以得出:m1*v1+m2*v2=m1*v1'+m2*v2';

m1*v1^2+m2*v2^2=m1*v1'^2+m*v2'^2;

得出:v1'=((m1-m2)*v1+2*m2*v2)/(m1-m2);

 当m2远远大于m1时,可以得出v1'=2*v2-v1;

代码:

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define N 1010
using namespace std;
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        cout<<(2*a-b)<<endl;
    }
    return 0;
}

1002、1003、1004未做出(以后慢慢补上);详见题解:(摘自:http://bestcoder.hdu.edu.cn/

1001 Harry And Physical Teacher
这是去年一个学妹问我的物理题。我是这样考虑的:题目告诉我们,小球和车发生的是完全弹性碰撞,那么动能是守恒的,而碰撞过程中,动量也守恒。联立动能守恒,动量守恒方程。然后还有一个很特殊的条件,车的质量远大于小球,那么结合下实际情况,一个质量很小的物体撞质量很大的物体,大的物体的速度是不会发生变化的。有了这个条件,就可以求解了。推导过程如下:
用表示碰撞前车的速度,表示碰撞后车的速度;用表示碰撞前球的速度,用表示碰撞后球的速度;用表示车的质量,用表示球的质量。()


可将约成
然后将视作,可得

1002 Harry And Dig Machine
由于Harry的dig machine是无限大的,而装载石头和卸载石头是不费时间的,所以问题可以转化成:从某一点出发,遍历网格上的一些点,每个点至少访问一次需要的最小时间是多少。这就是经典的旅行商问题,考虑到我们必须要遍历的点只有不到10个,可以用状态压缩解决。
表示i状态的点被访问过了,当前停留在点j 需要的最少时间。枚举另一点不在i状态内的点k,从点j节点走向点k,状态转移

其中表示点j与点k的最短距离,这个可以通过坐标O(1)计算得到。若有t个点包含石头,则算法复杂度为1003 Harry And Math Teacher
我们可以把第i层跟第i+1层之间楼梯的通断性构造成一个2*2的通断性矩阵,1表示通,0表示不通。那么从第a层到第b层,就是将a到b-1的通断性矩阵连乘起来,然后将得到的答案矩阵上的每个元素加起来即为方案数。想到矩阵的乘法是满足结合律的,那么我们可以用线段树来维护矩阵的乘积。每次我们只会修改某一个楼梯的通断性,所以就只是简单的线段树单点更新,成段求乘积而已。
整体复杂度

1004 Harry And Biological Teacher
这题稍难,题意是有一个字符总数小于等于100000的字符串的集合,然后有100000次询问,每次询问一个二元组{a,b},表示询问字符串a的后缀与字符串b的前缀最长能匹配多少。我的解法也比较复杂,先将字符串集合建成trie树,然后用trie树建立后缀自动机。然后将询问全部离线出来,然后对于询问中,b相同的,我们一起进行处理(根据b排序,相同的排在一起)。我们考虑某一组{a,b},这组询问的答案,我们怎么到后缀自动机上去找呢?首先,我们可以找到a在自动机上所对应的节点,考虑后缀自动机的parent tree,那么从这个节点,往上一直到根的链上,所有的节点所包含的子串,都是a的后缀。故而,我们只需要看这个链上有没有b的前缀,如果有,最长是多少。那么我们来看b的所有的前缀,首先,我们可以找到所有的b的前缀在自动机上对应的节点,对于b的长度为j的前缀,令它对应在后缀自动机上的节点为v,那么在parent tree中,v的子树下所有的节点都有可能以j为答案。这里就用到线段树的成段更新,单点求最大值就好了。
整体复杂度为。

其实后来想想,完全是我做复杂了,这题其实用AC自动机即可,只要把上述题解中的后缀自动机完全替换成AC自动机。。。不过标程已经写好了就没改
另外这题elfness学长提出了一个nsqrt(n)的算法,可能数据不是很强,elfness的程序跑的比我的快。。。

还有感谢何阳的耐心帮助,以及elfness提出的一些建议。

没有更多推荐了,返回首页