NC208009. 阿罗拉联盟赛
描述
输入描述
第一行输入一个 代表精灵数量
第二行输入一个字符 代表先攻击的人
第三行输入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); }