CF1296D Fight with Monsters 题解

题目:Link

同样是1500,为什么这比C题还水… 直接 贪心+排序

对于不用特殊操作可以自己打死的怪兽,直接计入答案
对于剩下的,我们求出每一个怪兽需要多少次特殊操作,才能得到分 抢到人头 。并将这些次数排序,最后用贪心的方法选次数最小的怪兽即可

下面讲一下怎样判断是否能直接得到分(不用特殊操作)

首先,我们把两人轮流攻击一次当成一个循环,这一次循环造成的伤害为 a + b a+b
当怪兽的健康值小于 a + b a+b 时,说明即将要决出胜负(得不得分)了。所以,计算时先将怪兽健康值 h i m o d ( a + b ) h_i \bmod (a+b)

接下来:若 h i = 0 h_i=0 h i > a h_i>a ,说明怪兽会被对手打死
否则,将会被自己打死

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxn=200000+10,inf=0x3f3f3f3f;
int a[Maxn];
int n,x,y,k,ans,cnt;
inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
int main()
{
//	freopen("in.txt","r",stdin);
	n=read(),x=read(),y=read(),k=read();
	
	for(int i=1;i<=n;++i)
	{
		int cur=read();
		cur%=(x+y);
		if(!cur)cur=x+y;
		if(cur<=x)++ans;
		else
		{
			cur-=x;
			a[++cnt]=cur/x;
			if(cur%x)++a[cnt]; // 求出需要用多少次特殊操作
		}
	}
	n=cnt;
	sort(a+1,a+1+n);
	for(int i=1;i<=n;++i) // 贪心
	{
		if(k>=a[i])++ans,k-=a[i];
		else break;
	}
	printf("%d\n",ans);
	
	return 0;
}
发布了75 篇原创文章 · 获赞 2 · 访问量 1783

猜你喜欢

转载自blog.csdn.net/Brian_Pan_/article/details/104495348