我想编写一种算法来查找顺序奖励点。 每个已确认邀请,邀请者获得(1/2)^ k分,其中k是邀请级别:级别0 (直接邀请的人)得到1分,级别1(原始客户邀请的人邀请的人) 给予1/2分,给予2级邀请(受1级邀请的人)奖励1/4分,依此类推。 只有第一个邀请才算:发送给同一个人的多个邀请不会再产生任何积分, 即使它们来自不同的邀请者,并且只有第一个邀请才算在内。 例如:
输入:
A recommends B
B accepts
B recommends C
C accepts
C recommends D
B recommends D
D accepts
将计算为: A从B的推荐中获得1分,B从C的推荐中获得0.5分, C的D推荐又获得0.25分。A的总得分为1.75分。
B从C的推荐中获得1分,C从D的推荐中获得0.5分。B没有从D的推荐中获得分,因为D之前是C所邀请的。 B获得1.5分。
C从D的推荐中获得1分。C获得1分。
输出:
{ “A”: 1.75, “B”: 1.5, “C”: 1 }
该算法应该是什么?我认为必须在这里使用动态编程。
答案 0 :(得分:2)
这只是树上的祖先搜索。通过跟踪深度,您知道要奖励多少分。
$ g++ -Wconversion -std=c++11 a.cc
a.cc: In instantiation of ‘constexpr double ToDouble(T) [with T = long int]’:
a.cc:22:45: required from here
a.cc:12:10: warning: conversion to ‘double’ from ‘long int’ may alter its value [-Wconversion]
return value;
^~~~~
a.cc: In instantiation of ‘constexpr T ToSquare(T) [with T = char]’:
a.cc:25:45: required from here
a.cc:17:16: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
return value * value;
此算法为 O(父母人数),由于您需要遍历所有父母进行更新,因此您知道无法在复杂性方面做得更好。