首页 > 其他分享 >CF1862F Magic Will Save the World

CF1862F Magic Will Save the World

时间:2023-08-27 10:46:22浏览次数:44  
标签:-- res sum long Will 枚举 World Save dp

思路

假设总共耗时是 \(s\) 秒,那么最多可以消灭的总生命值是 \(s\times(w+f)\)。

所以我们可以先求出所有怪物的生命值之和 \(sum\),那么,至少需要时间 \(t=\lfloor \frac{sum}{w+f} \rfloor\)。

然后我们可以算出用这些时间最多可以用水魔法消灭的生命值为 \(w\times t\)。

那么,我们可以用 dp 求出若干个怪物的生命值之和在小于 \(w\times t\) 的情况下的最大值 \(sum_w\),那么,在这种情况下,答案就是 \(\max(\lceil \frac {sum_w} w \rceil,\lceil \frac {sum-sum_w} f \rceil)\)。

因为最后答案可能比 \(t\) 大,所以我们可以把所有的可能都求一边,赛时没多想,随手遍历了 \(t\sim t+10\) 居然可以 AC,就没多想去看下一题了(主要是当时时间不多了),好像被 hack 了。

AC code

#include<bits/stdc++.h>
using namespace std;
long long T,w,f,n,a[105],dp[1000005],sum,ans,res;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld%lld%lld",&w,&f,&n),sum=0,ans=0x3f3f3f3f3f3f3f3f;
		for(long long i=1;i<=n;++i) scanf("%lld",&a[i]),sum+=a[i];
		if(sum<w||sum<f){printf("1\n");continue;}
		long long s=ceil(1.0*sum/(w+f));
		for(long long k=s;k<=s+10;++k)
		{
			memset(dp,0,sizeof(dp));
			for(long long i=1;i<=n;i++) for(long long j=k*w;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
			res=max((long long)ceil(1.0*dp[k*w]/w),(long long)ceil(1.0*(sum-dp[k*w])/f));
			if(res<ans) ans=res;
			//else break;
		}
		printf("%lld\n",ans);
	}
}

比赛水过去就水过去了,比完了就要思考正确的解法了。

第一种优化方式是减少 dp 次数,也就是枚举 \(j\) 的时候只枚举新增的那部分,但是时间复杂度仍然比较高。

所以我们换种思路,既然 dp 是为了得到若干个数加起来小于某个值的最大值,那么我们可以预处理出所有的可能的和,然后在来枚举得到答案不就行了?

那么,如何得到所有的可能的和呢?嗯,还是 dp,如下:

for(int i=1;i<=n;++i) for(int j=sum;j>=a[i];--j) dp[j]=dp[j]||dp[j-a[i]];

然后枚举所有可能的情况,然后算出答案即可。

for(int i=0;i<=sum;++i)if(dp[i]) ans=min(ans,max((long long)ceil(1.0*i/w),(long long)ceil(1.0*(sum-i)/f)));

完整代码就不放了。

标签:--,res,sum,long,Will,枚举,World,Save,dp
From: https://www.cnblogs.com/One-JuRuo/p/17659957.html

相关文章

  • 编程真好玩Python_2.1你的第一个程序HelloWorld
    一、作业效果。(1)程序首先显示信息:“你好,世界!”(2)询问你的名字(3)输入后,屏幕显示“你好,×××!”二、完成(1)新建文件夹,保存-命名(2)运行代码print("Hello,World!")person=input("Whatisyourname?\n")print("Hello,",person)(3)在编辑窗口中,选择Run-RunModule,运行程序......
  • Navicat Premium保存密码失败:Failed to save password Error code: -34018
    卸载卸载干净后重装15.0.29或之后的版本,卸载参见:https://download.csdn.net/blog/column/9651437/103915601:sudorm-Rf/Applications/Navicat\Premium.appsudorm-Rf/private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.play......
  • 1001:Hello,World!
    1001:Hello,World!时间限制:1000ms      内存限制:65536KB提交数:345055   通过数:168663【题目描述】编写一个能够输出“Hello,World!”的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常......
  • 全网最不墨迹解决方法,使用python3 worksheet.save()方式 出现:Test_list.worksheet.save(
    这是因为Worksheet对象没有save方法。要保存Excel工作簿,你需要使用Workbook对象的save方法。下面是一个修正后的示例代码:fromopenpyxlimportWorkbook#创建一个工作簿workbook=Workbook()#选择默认的活动工作表worksheet=workbook.active#定义要写入的数据列......
  • DPDK-22.11.2 [三] 官方helloworld编译运行讲解
    先安装dpdk编译完成后,先运行ninjainstall把相关内容安装到指定目录。ls/home/dpdkinstallbinincludelib64sharebin——一些脚本(用于绑定驱动等),编译的测试程序,编译的常用工具include——需要的头文件lib64——编译的类库share——文档相关......
  • Python程序员Visual Studio Code指南2 Hello World
    2HelloWorld2.1安装Python扩展VisualStudioCode的Python扩展提供了对Python语言的支持,包括语法着色、代码补全、过滤、调试、代码导航和代码格式化等功能,以及JupyterNotebook支持等Python特有的功能。您可以在VisualStudioCode的扩展视图中安装Python扩展。与从扩展市......
  • ue5游戏逆向之寻找GWorld,GName和GUObjectArray
    对于ue4而言,符号如果暴露出来的可以直接通过导出表寻找GWorld,GUObjectArray。ue4.23版本以前的通过GNames函数,ue4.23版本及其以后的通过FNamePool::FNamePool构造函数寻找GName。对于未暴露符号的寻找方法和ue5未暴露符号的三件套找法一样。寻找GWorld查看UE5.1源码,GWorld定义在......
  • HelloWorld
    HelloWorldjava代码publicclassHelloWorld{  publicstaticvoidmain(String[]args){    System.out.println("HelloWorld"); }}​编译+运行先切换代码所在目录用javac文件名.java编译再用java文件名运行 ......
  • C++ save vector or float to bin
    voidsave_bin(std::vector<float>&data_vector,std::stringname="mnn.bin"){std::ofstreamoutFile(name,std::ios::out|std::ios::binary);......
  • SharkTeam:Worldcoin运营数据及业务安全分析
    Worldcoin的白皮书中声明,Worldcoin旨在构建一个连接全球人类的新型数字经济系统,由OpenAI创始人SamAltman于2020年发起。通过区块链技术在Web3世界中实现更加公平、开放和包容的经济体系,并将所有权赋予每个人。并且希望让全世界每一个人都能有最低的生活保障,提高全民基本收入,迎接共......