ohへyes ohへyes
关注数: 21 粉丝数: 39 发帖数: 6,471 关注贴吧数: 37
ccf 201503-5最小花费问题。求解 这个题我觉得我的思路是没错的,样例也通过了,但是提交上去0分。 先说说我的思路: 根据已知的n个点,n-1条边可知,这些点和边组成的结构是树、考虑用数组保存所有的节点 定义一个结构体,结构里里边两个整型变量,一个用于保存当前节点的父节点(初始化的时候将所有节点的父节点初始化为-1,这样在加入各个边后0-n中的节点父节点值为-1的即为根节点);另一个用于保存当前节点到父节点的距离。节点数组记为node[]。每个节点的食物售价在另外数组中保存。 对于求最小花费的 起始终止点对,通过找这两个点的共同祖先节点来确定一条最短路径(树形结构下任意 两点在不重复经过某点的情况下有且仅有一条路径,且这条路径是最短的)。找到共同祖先后把起点到这个祖先的高度存下记为le(left的意思),把终点到这个祖先的高度记为ri(right的意思)。那么我们可以通过起点S0找到路径到公共祖先节点G,根据每个节点保存的父节点索引循环le+1次 可以得到一串索引 S0->S1->S2->......->Sle->G;同理可以通过重点T0依次找到点T0->T1->...Tri,这个只用循环ri次,因为下个点必定是G且已经知道了它的索引(这时候吧T0...Tri从数组尾部插入到路径数组中)。完成路径保存过程中,用数组cost保存每个点食物价格,用数组road保存上个点到当前点的距离。 使用贪心算法,某个点粮食价格比前一点的贵,就在前一个点买下当前点到下一点需要的粮食(如果前一个点到当前点使用的粮食是在更前边的点买的,此处买粮食的点就是更前边的点)。 代码:len表示cost长度 for(i=0;i<len;i++){ if(cost[i+1]>cost[i])cost[i+1]=cost[i]; } 最后依次累加 每两点距离即消耗粮食量*消耗粮食的单价
1 下一页