2020编码大赛(6)决赛

2020编码大赛题目  2020编码大赛(1)题目_编码赛题-CSDN博客

决赛,是8个队伍选出4个队伍并选出冠军亚军季军。

一,需求变更
1,在基地对自身装载能力升级:资源机器人默认装载能力为1024KB,通过装载能力升级,扩容自身最大负载,每扩容1024KB花费 30 金币,购买数量不限。
2,能量掠夺者,由资源机器人从己方基地购买,购买金额 30 金币。
3,系统默认金币数0。
4,回合调度顺序
(1)回合开始
(2)第一队的资源机器人或能量掠夺者开始调度
(3) 第一队还未调度的机器人开始调度
(4)第二队的资源机器人或能量掠夺者开始调度
(5)第二队还未调度的机器人开始调度
(6) 回合结束
5,兑换规则:
红色资源:每收集1单位 ,得分+1
绿色资源:每收集1单位 ,得分+2
蓝色资源:每收集1单位 ,得分+4

二,初步分析

1,不会有人主动创造异常
2,掠夺者的作用小于负载升级
3,如果买了掠夺者,那就先掠夺者,再机器人
4,先挖红矿得金币,扩负载,再挖蓝矿得分,绿矿是最差的

三,核心策略

核心策略有2个:

(1)购买策略,买负载升级、买掠夺者、买能量的平衡

(2)挖矿策略,挖红矿优先、挖蓝矿优先的平衡

然后我展开了一系列的建模计算:

然而最后也没能得到比较好的模型,就写了个垃圾代码。

挖矿策略:

static int targetCol()
{
    if (g_myTeam.worker.maxLoad / 1024 < 5 || g_myTeam.worker.power < 30) {
        return g_targetCol = maxColor();
    }
    return g_targetCol = minColor();
}

购买策略:

static int leftRounds()
{
    return allRemainResource() / ((g_enemyTeam.worker.maxLoad + g_myTeam.worker.maxLoad) / 1024);
}

// 购买掠夺者
static void purchaseLooter()
{
    int num = max(30 - g_myTeam.worker.power, 0);
    if (g_myTeam.golds >= num + 30 && !hasLooter() && g_myTeam.worker.maxLoad / 1024 >= 3 &&
        neighborNum(g_enemyTeam.campPos) < 4) {
        setPurchaseCommand("BUY_LOOTER");
        g_myTeam.golds -= 30;
    }
}

static int maxmaxload()
{
    return (g_enemyTeam.worker.maxLoad / 1024 * 3 + 1) * 1024;
}

// 购买负载升级
static void purchaseLoad()
{
    if (leftRounds() < 3) {
        return;
    }
    int num = max(60 - g_myTeam.worker.power, 0);
    while (g_myTeam.golds >= num + 30 && g_myTeam.worker.maxLoad < maxmaxload()) {
        g_myTeam.golds -= 30;
        setPurchaseCommand("UPGRADE_LOAD");
        g_myTeam.worker.maxLoad += 1024;
    }
}
// 购买能量
static void purchasePower()
{
    for (int i = 0; i < 60 - g_myTeam.worker.power; i++) {
        setPurchaseCommand("BUY_POWER");
    }
}

矿的优先级:

static void play(Pos start, Pos end, vector<Pos> &path)
{
    vector<Pos> tar(2);
    tar[0] = start;
    tar[1] = end;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < M; j++) {
            g_mapEntities2[i][j] = g_mapEntities[i][j];
        }
    }
    g_power2 = g_myTeam.worker.power;
    int colist[3];
    if (targetCol() == maxColor()) {
        if (RED == maxColor()) {
            colist[0] = RED, colist[1] = BLUE, colist[2] = GREEN;
        } else {
            colist[0] = GREEN, colist[1] = BLUE, colist[2] = RED;
        }
    } else {
        if (BLUE == minColor()) {
            colist[0] = BLUE, colist[1] = RED, colist[2] = GREEN;
        } else {
            colist[0] = GREEN, colist[1] = RED, colist[2] = BLUE;
        }
    }
    while (getPathSize(tar) < remainSize() && g_myTeam.worker.power > 0) {
        if (!getTarget(tar, colist[0])) {
            break;
        }
        if (samePos(g_posFlag, end)) {
            goto point;
        }
    }
    while (getPathSize(tar) < remainSize() && g_myTeam.worker.power > 0) {
        if (!getTarget(tar, colist[1])) {
            break;
        }
        if (samePos(g_posFlag, end)) {
            goto point;
        }
    }
    while (getPathSize(tar) < remainSize() && g_myTeam.worker.power > 0) {
        if (!getTarget(tar, colist[2])) {
            break;
        }
        if (samePos(g_posFlag, end)) {
            goto point;
        }
    }
point:
    g_myTeam.worker.power = g_power2;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < M; j++) {
            g_mapEntities[i][j] = g_mapEntities2[i][j];
        }
    }
    if (samePos(*(tar.end() - 1), g_posFlag)) {
        tar.erase(tar.end() - 1);
    }
    int ret = getPath(tar, path);
    if (ret == -1) {
        cout << endl << "play1()    ret = -1" << endl;
        return;
    }
}

static bool cmp(ResourceUnit a, ResourceUnit b)
{
    if (a.gemType != b.gemType) {
        if (g_targetCol == maxColor()) {
            return a.gemType > b.gemType;
        }
        return a.gemType < b.gemType;
    }
    return a.sizeOfUnit > b.sizeOfUnit;
}

掠夺者优先:

static void looterFirst()
{
    if (g_turn2 == g_myTeam.looter.playerName && g_turn2 != "") {
        g_turn = g_turn2;
    }
}

四,修复遗留bug

1,半决赛定时机制

// 估算压缩一份资源的大小
int getOneSize()
{
    if (g_onesize) {
        return g_onesize;
    }
    g_onesize = COMSIZE;
    if (g_collectHistory.size()) {
        int sizesum = 0, numsum = 0;
        for (unsigned int i = 0; i < g_collectHistory.size(); i++) {
            sizesum += g_collectHistory[i].sizeOfCompressionUnit;
            numsum += g_collectHistory[i].sizeOfUnit / 1024;
        }
        g_onesize = sizesum / numsum + 1;
    }
    return g_onesize;
}

int compress(string s)
{
    freopen(s.c_str(), "r", stdin);
    g_com = 0, g_flag = true;
    if (clock() - g_start > 8 * CLOCKS_PER_SEC) { // 这个分支应该走不到
        return getOneSize();
    }
    compress();
    return g_com / 1024 + 1;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值