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

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio