牛客小白月赛99 F-自爆机器人

原题链接: F-自爆机器人

**题意:**多测,每次给出n,m,t,坐标轴上初始机器人的位置在0,怪物的位置在n,机器人初始往正整数方向行走,碰到墙壁会转向并损害墙壁,碰到怪物会瞬间爆炸,爆炸威力等于行走时间,一共有m个位置可以放置墙壁。最多t秒机器人就会爆炸,问能够造成的最多伤害是多少?

**思路:**完全背包。令最终伤害是x,x由二部分构成,第一部分是0到n的时间,第二部分是墙壁反弹导致多走的时间,首先可以想到随意放置墙壁,多走的时间,一定可以用相邻墙壁的时间来表示。那么这就成了一个完全背包的问题,由m-1个物品,每个物品的价值是中间反弹多走的时间,代价也是,每一个物品都可以无限的选择,但是代价不能超过t-n。这样的时间复杂度是O((m-1)*(t-n)),明显无法通过。可以明显发现m-1个物品里面肯定有重复的,那么m-1个物品最多是多少?转化一下,那么就是长度为n的线段,最多可以由多少个长度不同的线段组成?贪心的想,线段的长度肯定是从一开始递增最多了,那么如果由v个不同的线段,那么1+2+3+4.....+v<=n,根据等差数列求和,所以v最大也就是根号n,所以真正的时间复杂度应该是O(sqrt(n)*(t-n)).

cpp 复制代码
//冷静,冷静,冷静
//调不出来就重构
//#pragma GCC optimize(2)
//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=1000000007;
void Jiuyuan()
{
	ll n,m,t;cin>>n>>m>>t;
	vector<ll> p(m+10);
	set<ll> kp;
	for(int i=1;i<=m;i++)cin>>p[i];
    sort(p.begin()+1,p.begin()+1+m);
	if(n>t)
	{
		cout<<0<<endl;return;
	}
	for(int i=2;i<=m;i++)
	{
		kp.insert(2*(p[i]-p[i-1]));
	}
	vector<ll> f(t-n+10);
	for(auto v:kp)
	{
		for(int j=v;j<=t-n;j++)
		{
			f[j]=max(f[j],f[j-v]+v);
		}
	}
	cout<<f[t-n]+n<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	ll T=1;
	cin>>T;
	while(T--)
	{
		Jiuyuan();
	}
    return 0;
}
相关推荐
业精于勤的牙17 分钟前
三角形最小路径和(二)
算法
风筝在晴天搁浅18 分钟前
hot100 239.滑动窗口最大值
数据结构·算法·leetcode
夏乌_Wx30 分钟前
练题100天——DAY31:相对名次+数组拆分+重塑矩阵
数据结构·算法
LYFlied30 分钟前
【算法解题模板】-解二叉树相关算法题的技巧
前端·数据结构·算法·leetcode
Ven%1 小时前
【AI大模型算法工程师面试题解析与技术思考】
人工智能·python·算法
天勤量化大唯粉1 小时前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
爱学习的小仙女!1 小时前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ1 小时前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard1 小时前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
fab 在逃TDPIE2 小时前
Sentaurus TCAD 仿真教程(十)
算法