首页 > 其他分享 >F. Bomb

F. Bomb

时间:2024-07-27 12:07:09浏览次数:6  
标签:Bomb tem res ll num 挑选 lld

原题链接

题解

贪心的每次挑选当前最大的,但是要挑选k次,因此我们没法去遍历挑选的过程,因此我们考虑最终形态,由于每次挑选最大的元素,因此最后所有数一定不超过某个数,二分由此而来

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k;

ll a[200005],b[200005];

ll check(ll x)
{
    ll res=0;
    for(ll i=1;i<=n;i++)
    {
        if(a[i]>x)
        {
            res+=(a[i]-x)/b[i]+((a[i]-x)%b[i]!=0);
        }
    }
    return res;
}

ll cal(ll x)
{
    //printf("x:%lld\n",x);
    ll ans=0;
    ll tem=k;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>x)
        {
            ll num=min((a[i]-x)/b[i]+((a[i]-x)%b[i]!=0),tem);
            //printf("ai:%lld  bi:%lld  num:%lld\n",a[i],b[i],num);
            ans+=a[i]*num-num*(num-1)/2*b[i];
            a[i]-=num*b[i];
            tem-=num;
        }
    }

    for(ll i=1;i<=n;i++)
    {
        if(!tem) break;
        if(a[i]==x)
        {
            ans+=x;
            tem--;
        }
    }
    return ans;
}

void solve()
{
    cin>>n>>k;

    for(ll i=1;i<=n;i++) cin>>a[i];
    for(ll i=1;i<=n;i++) cin>>b[i];

    ll l=-1,r=1e9;
    while(l+1<r)
    {
        ll mid=(l+r)/2;
        if(check(mid)<=k) r=mid;
        else l=mid;
    }

    cout<<cal(r)<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}

标签:Bomb,tem,res,ll,num,挑选,lld
From: https://www.cnblogs.com/pure4knowledge/p/18326800

相关文章

  • CSAPP Lab02——Bomb Lab完成思路详解
    看见的看不见的瞬间的永恒的青草长啊大雪飘扬——月亮之上完整代码见:CSAPP/bombatmain·SnowLegend-star/CSAPP(github.com)01字符串比较简单的把输入的字符串和地址“0x402400”内早已存储的字符串相比较。如果两个字符串相等则函数返回,否则炸弹爆炸。这里有......
  • csapp-bomblab(自信满满版)
    反汇编bomb文件要查看机器代码文件的内容,有一类称为反汇编器(disassembler,assembler是汇编程序,dis-加在某些词语前表示相反的意思)的程序非常有用。这些程序根据机器代码产生一种类似于汇编代码的格式。在linux系统中,带‘-d’命令行标志的程序OBJDUMP(表示“objectdump”)可以充当这......
  • CSAPP Lab-2 BOMBLAB
    第二个Lab就比较有趣了。这一个Lab的任务是,我们得到了一个bomb炸弹程序,这个炸弹程序有\(6\)个phase,每个phase都会读取我们的输入,判断我们的输入是否符合要求,如果正确这个phase的炸弹就会被拆除,否则炸弹就会爆炸。我们需要借助各种工具,对程序进行反汇编等等,获得能够......
  • 题解:AT_abc176_e [ABC176E] Bomber
    分析我们可以用\(hf\)和\(wf\)分别储存每行的目标数及每列的目标数。然后我们可以贪心:若想摧毁最多的目标,则选定的位置所在的行是所有行中目标最多的,所在的列是所有列中目标最多的(感性理解一下)。但是,选定的位置也可能有一个目标。在统计摧毁的目标数时,该目标被算了两次......
  • CSAPP Bomb Lab
    frompixiv参考博客手把手教你拆解CSAPP的炸弹实验室BombLabGDB调试-从入门实践到原理Linux上分屏软件Tmux使用教程知识点gdbjump函数名/*地址名jump能够很灵活地在gdb调试汇编代码时跳转当一不小心错过了关键信息时,我们便可以使用jumprun(......
  • Atcoder ABC 333 F - Bomb Game 2
    题目大意(采用0#语言):有n个人,每个人每次要么被“炸掉”,要么就被移到最后面去,概率都是1/2,求最后只剩下初始时排名为第i的人的概率。 这道题跟人数有关,而且跟位置有关。我们定义dp[i]表示一共有i个人,第i个为最后一位留下来时的概率。(不想写公式)定义j从0到i-1,表示从前面i-1......
  • 题解 ABC333F【Bomb Game 2】
    来个可能有点麻烦但不用动脑子的暴力做法。直接设\(f_{i,j}\)表示有\(i\)个人时,第\(j\)个人幸存的概率。显然有\(f_{1,1}=1\)。对于\(i>1\),分类讨论容易得到:\[f_{i,j}=\begin{cases}\frac{f_{i,n}}{2},&j=1\\\frac{f_{i-1,j-1}+f_{i,j-1}}{2},&1<j\lei\\\e......
  • 题解 accoders::NOI 5511【漂亮轰炸(bomb)】
    题解accoders::NOI5511【漂亮轰炸(bomb)】http://47.92.197.167:5283/contest/406/problem/4BZOJ3252是弱化版。problem一棵树,边带权。\(Q\)次询问,给定\(k\)和一个首都点,选择\(k\)条路径轰炸,其中必须由一轮要轰炸首都,但没有要求每条路径都经过首都。每条边只能被炸一次,......
  • CSAPP-Bomb Lab
    这个实验的逻辑是这样的需要使用gdbdebug进入到phase_x的各个函数,但是单步调试step是进不去的(也不难理解,如果gdb可以直接进入那这个实验还有什么难点)但是反汇编得到的结果是全部的内容,通过阅读反汇编代码,找到一些关键节点,通过gdb对二进制进行dubug添加breakpoint从而查看一些......
  • bomb_lab
    phase_1%eax作为上一个函数的返回值,若%eax为0,才可以执行跳转函数strings_not_equal,通过阅读代码可以发现这个函数是判断输入的两个字符串是否相等,知道函数传进去的参数分别在寄存器%edi和%esi中,其中%edi是我们输入的字符串寄存器%esi里的值就是本题答案,寄存器%es......