当前位置:首页 > 芯闻号 > 充电吧
[导读]题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5158


题目大意:

    敌我双方,我方n只军队,敌方m只军队,每只军队两个属性值,生命值和攻击力。两军交战,本身生命值减去对方的攻击力。若剩余生命值小于等于0,则牺牲。问我军能否消灭敌军,能的话,最多生还多少队伍,不能的话,输出-1。


解题:

    做的时候,怎么都理不清思路,因为要结合数据结构考虑,始终觉得无法找到合适的数据结构。参考了这篇博客,大致思路是这样的,首要任务是消灭全部敌军,次要任务是保全更多的自己的部队。先将我方军队按攻击力排序,敌方军队按生命值排序。用multiset维护我方军队的生命值,只要加入multiset中的军队,其攻击力都是足以消灭敌方的当前和以后的队伍的。对于敌方的一只军队,找到我方中,能消灭他的,且不被他消灭的最小生命值,倘若不存在,则牺牲multiset中最小的那个值。


总结:

    对于贪心问题,要明确贪心策略,理清思路,才能有助于解题。


补充:

    另外multiset的使用也需小心,erase操作,对应两种参数,如果是一个数值的话,那删除的是所有该数值的值,如果是一个迭代器,那只删除该迭代器对应的值。详见此博客。

代码:


#include#include#include#include#includeusing namespace std;
struct troop
{
	//伤害,生命值
	int harm,life;
}us[100010],en[100010];
//按攻击力排序
bool cmp1(troop a,troop b)
{
	return a.harm>b.harm;
}
//按生命值排序
bool cmp2(troop a,troop b)
{
	return a.life>b.life;
}
int main()
{
	int t,p=0,cnt,n,m;
	bool flag;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		printf("Case #%d: ",i);
		scanf("%d%d",&n,&m);
        for(int j=0;j<n;j++)
			scanf("%d%d",&us[j].harm,&us[j].life);
		for(int j=0;j<m;j++)
			scanf("%d%d",&en[j].harm,&en[j].life);
		//如果我方军队数量小于敌方,直接输出-1
		if(n<m)
		{
			printf("-1n");
			continue;
		}
		//我方按攻击力高排序
		sort(us,us+n,cmp1);
		//敌方按生命值排序
		sort(en,en+m,cmp2);
		//存储我方的攻击力
		multiset defense;
		//p我方下标,cnt我方牺牲数量
		p=cnt=0;
		flag=true;
        for(int j=0;j<m;j++)
		{
			for(int k=p;k=en[j].life)
				{
					defense.insert(us[k].life);
					p++;
				}
				else break;
			}
			//如果我方剩余军队不能消灭敌方队伍,break,输出-1
			if(defense.empty())
			{
				flag=false;
				break;
			}
			else
			{
			   //能不损失军队,则用我方生命值恰好高于敌方的去消灭
			   //倘若必须损失军队,则损失当前生命值最低的
			   multiset::iterator it;
               it=defense.upper_bound(en[j].harm);
			   if(it!=defense.end())
				   defense.erase(it);
			   else
			   {
				   defense.erase(defense.begin());
				   cnt++;
			   }
			}
		}
		if(!flag)
			printf("-1n");
		else 
			printf("%dn",n-cnt);
	}
	return 0;
}




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

近日,由于苹果公司终止了一项利润丰厚的供应协议,Coherent(高意)旗下一家晶圆厂正面临出售或关闭的困境。

关键字: 苹果 晶圆厂

May 28, 2024 ---- 根据TrendForce集邦咨询观察,预期2024年第一季MLCC出货量应该是近三季的谷底,第二季ODM手中订单除AI服务器(AI Server)需求稳步成长,其余消费性电子因传统季节...

关键字: AI 服务器 MLCC

5月28日,记者从在北京召开的新闻发布会上获悉,由中国光学光电子行业协会液晶分会主办的DIC系列会展活动——中国(上海)国际显示产业高峰论坛暨国际(上海)显示技术及应用创新展将于2024年7月2-5日在上海举行。

关键字: LED 折叠屏手机 车载视窗

威锋电子作为USB4、SuperSpeed USB、USB PD及显示器控制芯片领域的代表性企业,今日正式宣布,其全新产品VL605 USB-C转HDMI 2.1信号转换器已量产上市。该产品不仅支持USB PD 3.1...

关键字: 转换器 显示器 USB

互联网的无处不在,以至于数据存储已成为中小企业日常运营中不可或缺的一环。面对日益增长的数据量和日益复杂的数据管理需求,如何高效、安全、经济地存储数据,成为中小企业亟待解决的问题。今天就与大家分享,作为一体机以其卓越的性能...

关键字: 数据存储 处理器

业内最新消息,据 Business Insider 报道,德国大举发展太阳能,使得发电量激增,超过了消费需求,导致电价暴跌,甚至跌到了负值,形成了一个奇幻的能源市场,消费者使用电力反而可以获得报酬。

关键字: 太阳能

业内消息,上周夏普官网称,夏普与小米签署无线通信技术专利交叉许可协议。

关键字: 夏普 小米 通信 专利交叉许可

美国科技媒体Android Authority报导,谷歌手机芯片代工策略转向,由三星转投台积电(2330)怀抱。

关键字: 三星 谷歌 手机芯片 台积电 Tensor

业内消息,台积电资深副总经理暨副共同首席运营官张晓强在2024技术论坛上宣布,台积电已成功集成不同晶体管架构,在实验室做出CFET(互补式场效应晶体管),台积电今年 3nm 制程工艺将扩增三倍。

关键字: 3nm 台积电 CFET 晶体管

最新消息,昨天京东突然宣布涨薪:自 2024 年 7 月 1 日起,通过一年半时间,京东采销年度固定薪酬由 16 薪提升至 20 薪,业绩激励上不封顶。据了解,本次涨薪距上次调整还不到半年,比一般的周期调薪来得更快。

关键字: 裁员 涨薪 京东
关闭
关闭