YbtOJ 击毁战车

本文介绍了如何解决YbtOJ中的战车摧毁问题,通过解题思路和AC代码展示了利用贪心算法,在考虑战车速度和发射间隔的情况下,选择最近的战车进行摧毁。

目录:

前置知识

题目描述

解题思路

AC 代码​

前置知识:

        无(需要一个聪明的大脑)

题目描述:

解题思路:

         看到题目的那一瞬间,我脑海中曾闪现出一个想法——暴力!

        然而,暴力肯定过不了,然后,我就去了趟洗手间 (这个方法很好用,强力推荐!!!),于是,便有了以下这个做法:

        由于战车的速度有大有小,我们不能保证每次选择摧毁的战车是最优的。但知道距离 0 的位置,还知道速度,毫无疑问,可以求出战车到达 d 所需要的时间,而炮弹发射的间隔已知,可以根据贪心策略,每次选择距离 d 最近的战车摧毁(即:时间差最小的)。

AC 代码:

        小编正在学着压行 (超小声)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>//头文件
using namespace std;
int n,m,d;
int cnt;//累计摧毁了多少战车
long long rest[100001];
double sum;
struct node
{
	long long pos;
	long long speed;
}a[100001];//记录每一辆战车的信息
int tot;
double ans[100001];//每一战车到达d所需要的时间
bool cmp(int x,int y)
{
	return x<y;
}
int main()
{
	freopen("catch.in","r",stdin);
	freopen("catch.out","w",stdout);//文件读写
	scanf("%d%d%d",&n,&m,&d);
	rest[0]=0;//初始化,因为第一颗炮弹可以直接发射
	for(register int i=1;i<=n;i++) scanf("%lld",&rest[i]);
	sort(rest+1,rest+1+n,cmp);//给炮弹发射的休息间隔从小到大排个序
	for(register int j=1;j<=m;j++) scanf("%lld%lld",&a[j].pos,&a[j].speed);
	for(register int i=1;i<=m;i++)
	{
		if(d-a[i].pos>=0) ans[++tot]=(double)((d-a[i].pos)/(double)a[i].speed);//本身就在d外的战车不能被计入答案	
	}
	sort(ans+1,ans+1+tot,cmp);//给战车到达d的所需时间排个序
	for(register int i=1;i<=tot;i++)
	{
		if(sum<=ans[i])//判断是否能被摧毁
		{
			cnt++;
			sum+=(double)rest[cnt];//累加炮弹发射的时间
			if(cnt==n) break;//如果炮弹数等于n,直接break
		}
	}
	printf("%d\n",cnt);//输出
	fclose(stdin);
	fclose(stdout);
	return 0;//完结撒花
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值