列表

详情


NC208009. 阿罗拉联盟赛

描述

训练师小梁来到了阿罗拉地区观看阿罗拉联盟赛,这是一场精彩绝伦的比赛。
比赛规则如下:
A、B两位选手各有只精灵,每只精灵拥有自己的属性:血量 、 攻击力;
每人每次只能使用一只精灵,当有精灵死亡时(血量小于等于0),将替换一只精灵;A、B两人对于精灵的替换有着自己的打算。
现在、A拥有替换数组,A会选择综合力(综合力 = 血量 + 攻击力)第i大的精灵出战;B拥有替换数组,B将会选择综合力第j小的精灵出战
若两只精灵的综合力相同,则会选择初始顺序小的精灵出战。
例如:
A有2只精灵,其属性为:
攻击力:1、 3
血量: 3 、1
A选手选择攻击力为1,血量为3的精灵出战。
两人轮流进行攻击,当有一方的精灵全部死亡时,游戏结束。
小梁看完这场精彩绝伦的比赛后,决定对这场比赛进行复盘,请你根据给出的数据和小梁一起进行复盘。

输入描述

第一行输入一个 代表精灵数量
第二行输入一个字符 代表先攻击的人
第三行输入A选手的n只精灵的攻击属性
第四行输入A选手的n只精灵的血量属性
第五行输入B选手的n只精灵的攻击属性
第六行输入B选手的n只精灵的血量属性 
第七行输入A选手的替换数组 
第八行输入B选手的替换数组 

输出描述

分别输出A与B对对手的总伤害,以及自己的死亡精灵个数

(伤害按照攻击力计算,例如,A有一只精灵攻击力为100,血量为1,B有一只精灵攻击力为10,血量为1,A攻击B造成了100的伤害)

示例1

输入:

2
A
1 2
1 1
1 3
3 1
1 2
1 2

输出:

3 4 2 1

说明:

我们以这种形式表示精灵血量和攻击力(攻击力,血量) 

开始时双方按照替换顺序放上精灵,A选择综合力第1大的精灵(2,1),B选择综合力第1小的精灵(1,3).

第一回合A先攻击,使得B的精灵属性变为(1,1),造成2点伤害,

第二回合B攻击,使得A精灵属性变为(2,0),造型1点伤害,由于A的精灵血量位0,于是A替换了下一只精灵,综合力第2大的精灵,由于两只精灵综合力一样,于是选择序号小的那只((1,3),

第三回合A攻击,使得B精灵属性变为(1,0),造成1点伤害,由于B的精灵血量为0,于是替换下一只精灵,综合力第2小的精灵(3,1),

第四回合B攻击,使得A精灵属性变为(1,0),造成3点伤害,A没有更多精灵替换了,所以比赛结束。 

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 27ms, 内存消耗: 2856K, 提交时间: 2020-06-20 16:45:40

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
#include<string>
#define LL long long
#define li i<<1
#define ri i<<1|1
using namespace std;
inline LL read()
{
    char c=getchar();LL x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int maxn=100005;
struct node{
	LL id,gong,hp,zong;
};
node A[maxn],B[maxn];
bool cmp(node a,node b){
	if(a.zong==b.zong)
		return a.id<b.id;
	return a.zong<b.zong;
}
bool cmp1(node a,node b){
	if(a.zong==b.zong)
		return a.id<b.id;
	return a.zong>b.zong;
}
LL n,sum1,sum2,ans1,ans2,f;  // f为1 A动 0为 B动 
char flag[5];
LL AX[maxn],BX[maxn];
int main()
{
	n=read();
	scanf("%s",flag);
	for(int i=1;i<=n;++i)
		A[i].gong=read();
	for(int i=1;i<=n;++i)
		A[i].hp=read();
		
	for(int i=1;i<=n;++i)
		B[i].gong=read();
	for(int i=1;i<=n;++i)
		B[i].hp=read();
	
	for(int i=1;i<=n;++i){
		A[i].id=i;
		B[i].id=i;
		A[i].zong=A[i].gong+A[i].hp;
		B[i].zong=B[i].gong+B[i].hp;
	}
	
	for(int i=1;i<=n;++i)
		AX[i]=read();
	for(int i=1;i<=n;++i)
		BX[i]=read();
	
	sort(A+1,A+1+n,cmp1);
//	for(int i=1;i<=n/2;++i)
//		swap(A[i],A[n-i+1]);
	sort(B+1,B+1+n,cmp);
	if(flag[0]=='A')
		f=1;
	else if(flag[0]=='B')
		f=0;
	while(ans1!=n&&ans2!=n){
		if(f==1){  // A 动
			sum1+=A[AX[ans1+1]].gong;
			B[BX[ans2+1]].hp-=A[AX[ans1+1]].gong;
			if(B[BX[ans2+1]].hp<=0)
				++ans2;
		}else{  // B 动 
			sum2+=B[BX[ans2+1]].gong;
			A[AX[ans1+1]].hp-=B[BX[ans2+1]].gong;
			if(A[AX[ans1+1]].hp<=0)
				++ans1;
		}
		f^=1;
	}
	printf("%lld %lld %lld %lld\n",sum1,sum2,ans1,ans2);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 32ms, 内存消耗: 2404K, 提交时间: 2020-06-23 11:17:26

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int a,b,id;
}A[100005],B[100005];
bool cmp1(node x,node y)
{
	if(x.a+x.b==y.a+y.b)return x.id<y.id;
	return x.a+x.b>y.a+y.b;
}
bool cmp2(node x,node y)
{
	if(x.a+x.b==y.a+y.b)return x.id<y.id;
	return x.a+x.b<y.a+y.b;
}
int n,Ax[100005],Bx[100005];
int main()
{
    int i,j,ans1=0,ans2=0;
	char c;
    bool flag;
    scanf("%d %c",&n,&c);
    if(c=='A')flag=0;
    else flag=1;
    for(i=1;i<=n;i++)scanf("%d",&A[i].a),A[i].id=i;
    for(i=1;i<=n;i++)scanf("%d",&A[i].b);
    for(i=1;i<=n;i++)scanf("%d",&B[i].a),B[i].id=i;
    for(i=1;i<=n;i++)scanf("%d",&B[i].b);
    sort(A+1,A+1+n,cmp1),sort(B+1,B+1+n,cmp2);
    for(i=1;i<=n;i++)scanf("%d",&Ax[i]);
    for(i=1;i<=n;i++)scanf("%d",&Bx[i]);
    for(i=j=1;i<=n&&j<=n;flag^=1)
    {
    	if(!flag)
    	{
    		ans1+=A[Ax[i]].a,B[Bx[j]].b-=A[Ax[i]].a;
			if(B[Bx[j]].b<=0)j++;
		}
		else
		{
			ans2+=B[Bx[j]].a,A[Ax[i]].b-=B[Bx[j]].a;
			if(A[Ax[i]].b<=0)i++;
		}
	}
	printf("%d %d %d %d\n",ans1,ans2,i-1,j-1);
}

上一题