美文网首页
广告收益最大化

广告收益最大化

作者: 小幸运Q | 来源:发表于2024-12-16 23:11 被阅读0次

广告收益有时间区间和奖励金额,求最佳组合。

/*
 * 简单的广告投放排期程序
 * 
 * 给出一组数据,每个元素包括投放开始时间、结束时间、广告主id以及出价金额(单位为元,且为一小时的出价)。
 * 
 * 其中开始结束都按照int设计。
 * 
 * 后一个元素可以打破前一个元素的排期,比如A在8点到10点出10块一小时,如果B在9点到10点出20块一小时,则A的投放排期会被改为8到9点让A投,
 * 9到10点让B投。
 * 
 * 请设计一个程序,使得整体的广告排期可以使收入最大化。
 */
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Comparator;

class Plan {
    public int start_time;
    public int end_time;
    public int id;
    public int price;

    public Plan(int start_time, int end_time, int id, int price) {
        this.start_time = start_time;
        this.end_time = end_time;
        this.id = id;
        this.price = price;
    }
}

class Test {
    public static void orderPlan(PriorityQueue<Plan> pq) {
        int timestamp_now = pq.element().start_time;
        while (!pq.isEmpty()) {
            // select the highest price that start_time <= timestamp_now and end_time >
            ArrayList<Plan> arr = new ArrayList<>();
            Plan topPlan = new Plan(timestamp_now, timestamp_now, -1, -1);
            while (!pq.isEmpty() && pq.element().start_time <= timestamp_now) {
                if(pq.element().end_time > timestamp_now){
                    arr.add(pq.element());
                    if (topPlan.price < pq.element().price) {
                        topPlan = pq.element();
                    }
                }
                pq.remove();
            }

            // no intersection
            if (topPlan.id == -1) {
                // choose next plan
                if (!pq.isEmpty()) {
                    System.out.printf("skip %d-%d\n", timestamp_now, pq.element().start_time);
                    timestamp_now = pq.element().start_time;
                } else {
                    // final
                    return;
                }
            } else {
                // has intersection, choose the next plan's start_time as next timestamp_now
                // if next plan(not equal) is later than current end_time
                if (!pq.isEmpty() && pq.element().start_time > topPlan.end_time) {
                    System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, topPlan.end_time);
                    timestamp_now = topPlan.end_time;
                } else if (!pq.isEmpty() && pq.element().start_time < topPlan.end_time) {
                    while (!pq.isEmpty() && pq.element().start_time < topPlan.end_time) {
                        if (pq.element().price > topPlan.price) {
                            System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, pq.element().start_time);
                            timestamp_now = pq.element().start_time;
                            break;
                        }
                        arr.add(pq.element());
                        pq.remove();
                    }
                    if (pq.isEmpty()) {
                        System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, topPlan.end_time);
                        timestamp_now = topPlan.end_time;
                    } else {
                        if (pq.element().start_time < topPlan.end_time) {
                            System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, pq.element().start_time);
                            timestamp_now = pq.element().start_time;
                        } else {
                            System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, topPlan.end_time);
                            timestamp_now = topPlan.end_time;
                        }
                    }
                } else if (pq.isEmpty()) {
                    System.out.printf("[ID:%d]%d-%d\n", topPlan.id, timestamp_now, topPlan.end_time);
                    timestamp_now = topPlan.end_time;
                }
            }

            for (int i = 0; i < arr.size(); i++) {
                if (arr.get(i).end_time > timestamp_now) {
                    pq.add(arr.get(i));
                }
            }
        }
    }

    public static void main(String[] args) {
        PriorityQueue<Plan> pq = new PriorityQueue<>(1, new Comparator<Plan>() {
            @Override
            public int compare(Plan a, Plan b) {
                if (a.start_time == b.start_time) {
                    // money next
                    return a.price - b.price;
                } else {
                    return a.start_time - b.start_time;
                }
            }
        });

        // [0-10]
        pq.add(new Plan(0, 10, 1, 2));
        pq.add(new Plan(7, 9, 2, 10));
        pq.add(new Plan(8, 10, 3, 11));
        pq.add(new Plan(18, 20, 4, 11));

        orderPlan(pq);
    }
}
  • 我的解题思路:

通过优先队列,按照start time小的优先,如果start_time相同则price高的优先。

有一个timestamp指针,该时间点会有一个最优的广告A,但是这个广告的end time不一定是当前最优的end time,因为可能有price更高,但是start time比当前选中的广告A更早开始的广告B作为下一片段的开始。此时需要按照时间顺序查找start time> A的end time 且 price > 广告A price的下一个潜在广告B。

如果A和B之间没有交集,那就设置timestamp为A的end time,因为可能有其他广告可以衔接A和B之间的空白。

如果A和B有交集,那就设置timestamp为B的start time。

  • 期间end time < timestamp的广告需要剔除。可能产生交集成为潜在A或者可能成为下一条广告B的需要回填优先队列。

  • 时间复杂度:O(nlog2n)

相关文章

  • 帮扶链零撸

    2020必做项目HPC帮扶链DAPP,超越gec,并肩比特币, 收益最大化就是上矿机才能收益最大化,每月收益在40...

  • 【BH区块链项目热点问答】NeoWorld游戏里怎么玩才能收益最

    问:在NeoWorld游戏里怎么玩才能收益最大化?有没有什么技巧和攻略? 答:Neoworld想收益最大化必须在游...

  • 今天的转盘……

    每天发文之前都是先把抽奖转盘转完,让收益最大化。可是今天这个转盘看完广告动不动自己就不转了。 没办法,退出来再进去...

  • 抽中10000加成卡后,你如何创造收益最大化?

    抽中10000加成卡后,你如何收益最大化? 下面简单5个步骤,可以达到收益最大化。 1,更文3~5篇2,加粉200...

  • 收益最大化

    收益最大化 人们普遍都想 拥有更多的 于是 生财之道 五花八门 无奇不有 生财有大道 厚德方载物 舍得 舍得 是有...

  • 创业营销,投100万广告赚400万,更厉害的是后面这件事

    许多老板和创业者都有数量不少的广告营销预算,他们最想知道如何投放才能让收益最大化。 有一家美国公司的做法特别值得学...

  • 投资的目标只有两个

    无论是理财还是风险投资,第一个目标是尽可能获得最大化收益。那么怎么样获得最大化的收益呢?这个问题比较复杂,不是简单...

  • 财务管理的目标

    关于财务管理的目标,市面上众说纷纭,比较普遍的有三种观点,分别是利润最大化,每股收益最大化和股东财富最大化。 利润...

  • 学习收益管理,可以从这张图开始

    分享主题:收益管理,淡旺季收益最大化的思维模式。 何为收益管理 我把收益管理当作我的爱好,到现在为止已经钻研了八年...

  • 财务管理的三种目标

    CPA财管中提到财务管理的三种目标:利润最大化、每股收益最大化、股东财富最大化。这讲的是企业财务的管理者应该以什么...

网友评论

      本文标题:广告收益最大化

      本文链接:https://www.haomeiwen.com/subject/lmupsjtx.html