11.11新生赛(2021)G题AT2580 Widespread整理[★★★★★]

2023-10-17 21:10

本文主要是介绍11.11新生赛(2021)G题AT2580 Widespread整理[★★★★★],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[ARC075B] Widespread - 洛谷https://www.luogu.com.cn/problem/AT2580?contestId=56578前排提醒

本题的数据范围比较大,全用long long最好

否则会有一部分点会WA

我们每一次攻击,都有一个怪兽受到A点伤害,其余怪兽受到B点波及伤害

设怪兽总数为n 一共进行了x次攻击

t[i]为第i只怪兽受到的中心爆炸攻击的次数

则这只怪兽所受伤害总量为 A*t[i]+(x-t[i])*B = B*x +(A-B)*t[i]

且 x=t[1]+t[2]+...+t[n]

所有怪兽都会受到B*x点伤害!

先将所有怪兽从小到大排序

sort(a,a+n)

采用二分的方式来寻找攻击的次数x

攻击次数最少是1 所以二分的左边界left=1

右边界先初始化为0

每一次输入a[i]时 right+=x/b+1 //也就是假设最坏情况,这只怪兽总是受到波及伤害 不管波没波及死都+1.波及死了,加1不影响结果. 没波及死,再中心攻击一次就死了

为什么总是受到波及伤害就是最坏情况呢.

因为题目假定A>B 

如果任有怪物受到中心伤害的,肯定比全部怪物都受波及伤害所需的攻击次数要少.因为a[i]/a < a[i]/b,那总和自然也小了

(注意二分的左边界不能用每个怪物血量除以A的和来计算,因为有波及的存在,可能并不需要那么多次数就会死)

找到了二分的左右边界

就可以开始二分了,我们二分的就是攻击的总次数 

	while(left<right){if(check(mid)){right=mid;}else left=mid+1;mid=(left+right)/2;//根据yxc的二分模板//left+1 时 mid=(left+right)/2;//right-1 时 mid=(left+right+1)/2;//这里显然是前者}

然后我们来写二分的check函数

想求出每一个怪物所受的攻击次数是很难的,所以我们换个思路

只假定攻击次数为x,验证能否消灭所有怪物.

每只怪物必定受到x*B点伤害

所以第[i]只怪物的血量m[i]=m[i] - x*B

如果这只怪物剩余血量小于等于0 ,那就不用看了,直接被波及死,不计入攻击次数x

如果大于0  根据我们前面得出的那个式子  

这只怪兽所受伤害总量为 A*t[i]+(x-t[i])*B = B*x +(A-B)*t[i]

而 t/(A-B)  就是要对第i只怪物进行攻击的次数t[i]

当然,如果剩余血量能整除(A-B) 那攻击次数正好为剩余血量/(A-B)

否则需要再+1  (再多一次中心攻击)

从血量最大的开始遍历

int check(long long int x)// 当总共发起x次攻击时
{long long int sum=0;for(int i=n-1;i>=0;i--){long long int t=m[i]-x*b;//受到所有波及伤害后剩余血量//小于0就不用管了  直接被波及死if(t>0){if(t%(a-b)==0) sum+=t/(a-b);else sum+=t/(a-b)+1;}	}if(sum>x) return 0;return 1;
}

最后献上完整AC代码

#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
long long int m[1000010];
long long int n;
long long int a,b;
int check(long long int x)// 当总共发起x次攻击时
{long long int sum=0;for(int i=n-1;i>=0;i--){long long int t=m[i]-x*b;//受到所有波及伤害后剩余血量//小于0就不用管了  直接被波及死if(t>0){if(t%(a-b)==0) sum+=t/(a-b);else sum+=t/(a-b)+1;}	}if(sum>x) return 0;return 1;
}
int main()
{//freopen("uva.txt","r",stdin);cin>>n>>a>>b;long long int left=1;long long int right=0;for(int i=0;i<n;i++){long long int x;scanf("%lld",&x);m[i]=x;right+=x/b+1;}right+=1;sort(m,m+n);long long int mid=(left+right)/2;while(left<right){if(check(mid)){right=mid;}else left=mid+1;mid=(left+right)/2;}printf("%lld",right);return 0;
}

这篇关于11.11新生赛(2021)G题AT2580 Widespread整理[★★★★★]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227976

相关文章

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

JavaScript整理笔记

JavaScript笔记 JavaScriptJavaScript简介快速入门JavaScript用法基础语法注释关键字显示数据输出innerHTML innerText属性返回值的区别调试 数据类型和变量数据类型数字(Number)字符串(String)布尔值(Boolean)null(空值)和undefined(未定义)数组(Array)对象(Object)函数(Function) 变量

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

站长常用Shell脚本整理分享(全)

站长常用Shell脚本整理分享 站长常用Shell脚本整理分享1-10 站长常用Shell脚本整理分享11-20 站长常用Shell脚本整理分享21-30 站长常用Shell脚本整理分享31-40 站长常用Shell脚本整理分享41-50 站长常用Shell脚本整理分享51-59 长期更新

我自己常用的eclipse 快捷键整理

---------------- 我自己改的快捷键: 复制当前行单下一行  ctrl alt n   --------------------- 自带快捷键: 快速定位到一行  CTRL+L 向上(下)移动选中的行:ALT+UP/DOWN ARROW 删除行(Delete Line):CTRL+D CTRL + 1也很有用     ----------