首页 > 其他分享 >CF1996F Bomb

CF1996F Bomb

时间:2024-08-27 12:41:29浏览次数:8  
标签:cnt Bomb CF1996F cin int mid long 选取

前言

大概是一个经典题,只不过比较难想

思路

首先考虑 \(O(k)\) 的做法,很明显,每次我们可以选取一个最大值,然后在把他放回优先队列里面,只不过这样不足以通过此题

而我们又发现只要我们知道最后一次选取的数(第 \(k\) 大)是多少,则前面的数全都可以知道(即对于每个 \(a_i\) ,看比这个数大的数,用等差数列求和)

其实第 \(k\) 大的数明显具有单调性,判断第 \(k\) 大只需要看每个 \(a_i\) 比 \(mid\) 大的数的个数即可

在最后统计答案时候需要注意,可能第 \(k\) 大的数有多个,我们可能只需要选取其中的几个,统计答案时候需要注意

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],b[N];
int n,k;
bool check(int mid)
{
    long long cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>=mid)cnt=cnt+1LL*(a[i]-mid)/b[i]+1;
    }
    return cnt>=k;
}
int main()
{
    int _;
    cin>>_;
    while(_--)
    {
        cin>>n>>k;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) scanf("%d",&b[i]);
        int l=0,r=1e9,best=-1;  
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(check(mid))
            {
                l=mid+1;
                best=mid;
            }
            else r=mid-1;
        }//求第 k 大
	//best 即为第 k 大
        if(best==-1)//特判选不完的情况
        {
            long long ans=0;
            for(int i=1;i<=n;i++)
            {
                long long siz=a[i]/b[i]+1;
                long long h=a[i]-(siz-1)*b[i];
                ans=ans+1LL*(h+a[i])*siz/2;
            }
            cout<<ans<<"\n";
            continue;
        }
        long long ans=0;
        long long sum=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]<best) continue;
            long long cnt=(a[i]-best)/b[i]+1;
            long long h=(a[i]-(cnt-1)*b[i]);
            if(h==best) h+=b[i],cnt--;//先选择大于第 k 大的数
            ans=ans+1LL*(h+a[i])*(cnt)/2;
            sum=sum+1LL*cnt;
        }
        //cout<<sum<<"\n";
        ans=ans+1LL*best*(k-sum);//若不足则用第 k 大补齐即可
        cout<<ans<<"\n";
    }
}
/*
1
5 1000
1 2 3 4 5
5 4 3 2 1
*/

标签:cnt,Bomb,CF1996F,cin,int,mid,long,选取
From: https://www.cnblogs.com/Oistream/p/18382438

相关文章

  • Bomb(数位DP)
    题目描述Thecounter-terroristsfoundatimebombinthedust.Butthistimetheterroristsimproveonthetimebomb.Thenumbersequenceofthetimebombcountsfrom1toN.Ifthecurrentnumbersequenceincludesthesub-sequence"49",thepowero......
  • HDU 2873 Bomb Game
    题目链接:HDU2873【BombGame】思路    数据范围较小,直接暴力求所有状态的SG值,然后将棋盘上所有炸弹的对应位置的SG值异或起来就可以得到当前局面的结果。对于相同位置的上有两个炸弹会自动爆炸,本来他们的SG值的异或和就为0,所以可以不用管。代码intn,m,vis[N*N......
  • 3555.Bomb
    3555.Bomb题目描述Thecounter-terroristsfoundatimebombinthedust.Butthistimetheterroristsimproveonthetimebomb.Thenumbersequenceofthetimebombcountsfrom1toN.Ifthecurrentnumbersequenceincludesthesub-sequence"49",t......
  • F. Bomb
    原题链接题解贪心的每次挑选当前最大的,但是要挑选k次,因此我们没法去遍历挑选的过程,因此我们考虑最终形态,由于每次挑选最大的元素,因此最后所有数一定不超过某个数,二分由此而来code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lln,k;lla[200005],b[......
  • 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......