首页 > 其他分享 >Topcoder SRM647-Div1-Lv2 CtuRobots

Topcoder SRM647-Div1-Lv2 CtuRobots

时间:2024-05-09 17:11:45浏览次数:21  
标签:cap frac Lv2 机器人 CtuRobots 燃料 ch Topcoder getchar

涉及知识点:动态规划

题意

有 \(n\ (\leq 500)\) 个机器人,每个机器人的价格为 \(cost_i\ (\leq 10^4)\),油箱容量为 \(cap_i\ (\leq 10^9)\),一单位燃料可以走一单位距离,你可以给购买的机器人编号,机器人 \(k\) 可以给机器人 \(k+1\) 补充燃料,但是任意时刻机器人的燃料不能超过其油箱容量上限,你有 \(B\ (\leq 10^4)\) 的预算,购买一些机器人,机器人从 \(0\) 出发,问所有机器人最终都能返回初始点的前提下,能探索到的最大距离。

思路

Tips: 题目并没有对于“速度”进行规定,也就是说,只要距离限制满足,可以视为一台机器人可以在任何时刻到某个地方,不过这个性质并不影响做题

子问题 1

假设我们已经知道了所有已经购买的机器人,如何计算能够探索的最大距离?一个显然的思路是我们只需要油箱最大的机器人进行探索任务,而其他的机器人的任务只是给它补充燃料,两个机器人同时执行探索任务只会浪费燃料没有任何好处。并且我们可以发现,对于某台负责补充燃料的机器人 \(i\),它的最佳选择是在 \(\large\frac{cap_i}{3}\) 处给下一个机器人提供燃料并返航,因为如果小于这个节点时可提供的燃料大于可被接收的燃料造成浪费,而大于这个节点自己会消耗额外的燃料。而且一个很巧妙的性质在于在 \(\large\frac{cap_i}{3}\) 处给下一个机器人补充燃料后,下一个机器人刚好回满。因此我们只需要将机器人的油箱容量从小到大排序,设 \(f_i\) 为机器人 \(i\) 的实际续航时间,有递推关系:\(\large f_1=cap_1,f_2=\frac{f_1}{3}+cap_2,\dots,f_i=\frac{f_{i-1}}{3}+cap_i\),而能探索到的最大距离便为油箱最大的机器人 \(k\) 的续航除以 \(2\) 即 \(\large\frac{f_k}{2}\)。

子问题 2

如何购买机器人使得探索距离最大?我们对于刚才的递推关系再加上预算的限制,就可以 DP 了,首先将机器人按油箱大小排序,设 \(f[i][j]\) 表示前 \(i\) 个机器人可选,预算为 \(j\) 时最大可能的续航(由于还要返程所以答案为 \(f[i][j]/2\)),每次的决策为判断是否购买第 \(i\) 个机器人。

代码

#include<bits/stdc++.h>
#define getmax(x,y) x=max(x,y)
using namespace std;
#ifdef ONLINE_JUDGE
#define getchar __getchar
inline char __getchar(){
    static char ch[1<<20],*l,*r;
    return (l==r&&(r=(l=ch)+fread(ch,1,1<<20,stdin),l==r))?EOF:*l++;
}
#endif
template<class T>inline void rd(T &x){
    T res=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while('0'<=ch && ch<='9'){res=res*10+ch-'0';ch=getchar();}
    x=res*f;
}
typedef double db;
const db eps=1e-8;
const int MAXN=505,MAXB=1e4+5;
int n,bud;
db f[MAXN][MAXB];
struct BOT{
    int cost;
    db cap;
    bool operator < (const BOT& b){
        return cap<b.cap;
    }
}bt[MAXN];
int main(){
    rd(bud);
    rd(n);
    for(int i=1;i<=n;i++){
        rd(bt[i].cost);
    }
    rd(n);
    for(int i=1;i<=n;i++){
        rd(bt[i].cap);
    }
    sort(bt+1,bt+1+n);
    for(int i=1;i<=n;i++){
        memcpy(f[i],f[i-1],sizeof(f[i]));
        for(int j=bt[i].cost;j<=bud;j++){
            getmax(f[i][j],f[i-1][j-bt[i].cost]/3+bt[i].cap);
        }
    }
    cout<<fixed<<setprecision(8)<<f[n][bud]/2.0<<endl;
    return 0;
}

标签:cap,frac,Lv2,机器人,CtuRobots,燃料,ch,Topcoder,getchar
From: https://www.cnblogs.com/SkyNet-PKN/p/18182730

相关文章

  • TOPCODER时期训练赛小总结
    20240407模拟赛T1TurnOnLamps直接树上dp维护子树内是否有路径在根节点处停止的最小操作数\(O(n)\)维护即可,数据范围纯sbT2XorCards线性基或高斯消元板子,高斯消元比较好想。可以枚举大于等于时前若干位是相同的,然后直接搞出限制消元即可。时间复杂度合理。线性基则非常......
  • BEVDet的进阶BEVPoolv2:A Cutting-edge Implementation of BEVDet Toward Deployment
    论文地址:https://arxiv.org/pdf/2211.17111.pdf​arxiv.org/pdf/2211.17111.pdf代码地址:GitHub-HuangJunJie2017/BEVDet:OfficialcodebaseoftheBEVDetseries.​github.com/HuangJunJie2017/BEVDet/tree/dev2.0整体思想:作者从工程优化的角度考虑优化BEVDet,提出了B......
  • TopCoder SRM478C RandomApple 题解
    题意:有\(k\)种苹果和\(n\)个箱子,每个箱子中有一些苹果,先等概率选取\(n\)个箱子组成集合的非空子集,再从选出的苹果中随机选一个,问每种苹果被选中的概率是多少箱子\(i\)有\(a_{i,j}\)个第\(j\)种苹果,第\(i\)个箱子的总苹果数\(siz_i=\sum\limits_{j=1}^ka_{i,j}\),苹果总数\(sum=\su......
  • RandomPaintingOnABoard TopCoder - 12607
    AnoteabouttheconstraintsConstraintsindicateusthatthemaximumwidthandheightwillbe21.Thereisanotherconstraintthough:Themaximumtotalnumberofcellsis150.Thiscanhelpusbecauseitmeansthatthesmallerdimensionwillbeatmost1......
  • [TopCoder 13001] BigO 题解
    [TopCoder13001]BigO题解题目描述给定一张有向图,当\(L\)趋近于无穷大时,长度为\(L\)的路径条数有\(S\)条,此时若\(S=O(L^k)\),输出\(k\),否则如果没有多项式的大O表示法,输出\(-1\)。指数情况首先如果一张图中存在如下强连通分量,则\(S=O(2^L)\)。因为每次到1......
  • TopCoder 15903 EllysNim
    TopCoder15903EllysNim(https://vjudge.net/problem/TopCoder-15903)\(n\)看似有点东西,实际上就只是一个贪心。。。设\(i\)表示第\(i\)位,且\(i\)从\(0\)开始计数那么我们肯定是让\(i\)从高位到低位枚举,若当前位的异或值为\(1\),想办法让它变成\(0\)且不会改变更高位的异或值......
  • Topcoder 10880 - Rabbit Problemming
    \[兔子,兔子,兔子\]首先,我们考虑一只兔子可以达到的最大值\(mx_i\)和最小值\(mn_i\),这个可以很方便的求出来。并且每只兔子的取值是独立的。然后,如果一个组合能被选中,那么在这个组合内部所有的兔子都取\(mx_i\),其他的兔子都取\(mn_i\)的时候一定也能被选中。我们就钦定所有......
  • Topcoder 10880 - Functional Equation
    首先分析一下这个鬼畜的函数,我们考虑\(f(x)+2C\)\(=f(2f(x)-x+1)+C\)\(=f(2f(2f(x)-x+1)-(2f(x)-x+1)+1)\)\(=f(2(f(x)+C)-2f(x)+x-1+1)\)\(=f(x+2C)\)也就是\(f(x)=f(x\bmod2C)+2C\lfloor\dfrac{x}{2C}\rfloor\)也就是,只要决定了\(f(x)\),\(f(x+2mC)\)也就被确定了。......
  • 题解 Topcoder SRM789 FollowingNim
    题目链接题意给定\(n\)堆石子\(a_1,a_2,\cdots,a_n\)和一个集合\(S\),两名玩家轮流行动,每次可以在某堆石子中取走\(x\)个(不能不取)。特殊地,如果\(x\inS\),那么下......
  • ALV2
    *&---------------------------------------------------------------------**&ReportZ14*&*&-----------------------------------------------------------------......