只是一道题
  • 板块灌水区
  • 楼主WaterSky
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/10/5 14:18
  • 上次更新2024/10/5 15:50:20
查看原帖
只是一道题
708963
WaterSky楼主2024/10/5 14:18

在一个水平的数轴上有一个自爆小卡车和一个恐怖分子,自爆卡车初始的坐标为 00,恐怖分子的坐标为 nn,自爆卡车在启动后以 11 坐标每秒的速度向恐怖分子移动,在遇到恐怖分子的瞬间爆炸,造成的伤害为自爆卡车运行时间。现在你有 mm 个方向转换器位于 mm 个不同的坐标上。你可以重复的使用方向转换器(在该坐标安装方向转换器,拆除方向转换器),使得自爆卡车到达该点时,方向取反,相反方向移动。方向转换器的安装与拆除时间忽略不计。这样有可能使得自爆卡车无限的运行下去,为了避免这种情况,自爆卡车有一个自爆最大时间 tt,即 tt 秒后会自动爆炸,问自爆卡车会对恐怖分子造成最大的伤害是多少。


第一行一个整数 TT,表示有 TT 组测试数据

对于每组测试数据:第一行三个整数 n,m,tn,m,t

第二行给出m个不同的整数,表示可安装拆除方向转换器的坐标 xix_i

1t1e4,1m<n2e5,1t2e5,1xi<n1 \le t \le 1e4,1 \le m<n \le 2e5,1 \le t \le 2e5,1\le x_i < n,tt 组数据 nn 的总和小于等于 2e52e5,tt 的总和小于等于 2e52e5


思路:完全背包。
死因:TLE


#include<bits/stdc++.h>
using namespace std;
int T,n,m,t;
int x[200005],a[200005],f[200005];
int ans; 
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&t);
		t-=n;
		for(int i=1;i<=m;++i)
			scanf("%d",&x[i]);
		sort(x+1,x+1+m);
		for(int i=1;i<m;++i)
			a[i]=(x[i+1]-x[i])*2;
		for(int i=1;i<m;++i)
			for(int j=a[i];j<=t;j++)
				f[j]=max(f[j-a[i]]+a[i],f[j]);
		for(int i=0;i<=t;++i)
			ans=max(ans,f[i]),f[i]=0;
		ans+=n;
		printf("%d\n",ans);
		ans=0;
	}
	return 0;
} 
2024/10/5 14:18
加载中...