目录:
前置知识:
无(需要一个聪明的大脑)
题目描述:


解题思路:
看到题目的那一瞬间,我脑海中曾闪现出一个想法——暴力!
然而,暴力肯定过不了,然后,我就去了趟洗手间 (这个方法很好用,强力推荐!!!),于是,便有了以下这个做法:
由于战车的速度有大有小,我们不能保证每次选择摧毁的战车是最优的。但知道距离 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;//完结撒花
}


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

2779

被折叠的 条评论
为什么被折叠?



