A.疾羽的救赎(模拟)
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
map<int,int>m;//用来记录不同棋子的坐标
vector<int>res[N];//用来记录每一格子上棋子的叠加状态,只存放1,2,3分别代表紫色,绿色,黄色棋子
int t,z=1,l=2,h=3;
void solve(int g,int a,int b)
{
if(b>0)
{
int pos;
bool flag=false;
int x=m[a];//当前a棋子的坐标
for(int i=0;i<res[x].size();i++) //判断当前这个坐标上棋子的叠加情况
{
if(res[x][i]==a)//代表找到了需要移动的棋子
{
flag=true;
pos=i;//pos记录当前棋子的位置,便于后面移动棋子以后,把移动完的棋子从当前坐标删除
}
if(flag)
{
m[res[x][i]]+=b;//移动棋子
res[m[a]].push_back(res[x][i]);//把棋子放到目标位置上
}
}
int y=res[x].size();
for(int i=0;i<y-pos&&!res[x].empty();i++)//删除原来位置上移动完的棋子
{
res[x].pop_back();
}
}else//跟上面同理
{
bool flag=false;
int x=m[a];
int pos;
for(int i=0;i<res[x].size();i++)
{
if(res[x][i]==a)
{
flag=true;
pos=i;
}
if(flag)
{
m[res[x][i]]+=b;
res[m[a]].push_back(res[x][i]);
}
}
int y=res[x].size();
for(int i=0;i<y-pos&&!res[x].empty();i++)
{
res[x].pop_back();
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
m[z]=2;m[l]=3;m[h]=4;//初始时棋子所在位置
res[2].push_back(1);res[3].push_back(2);res[4].push_back(3);//起初棋子所在位置
for(int i=0;i<12;i++)
{
int x,y;
scanf("%d%d",&x,&y);
solve(i,x,y);
}
for(int i=1;i<=9;i++)
{
res[i].clear();//每次需要把原有状态清空
}
if(m[z]==9&&m[l]==9&&m[h]==9)
{
cout<<"Y"<<endl;
}else
{
cout<<"N"<<endl;
}
}
return 0;
}
G. 精灵宝可梦对战(模拟)
题目下面链接
https://codeforces.com/gym/104725/problem/G
AC代码
#include<bits/stdc++.h>
using namespace std;
const long long N=1e7+10;
long long n,m,k;
struct A
{
int h,a,b,c,d,e,w,en;//en表示当前的能量值
};
queue<A>q1,q2;//用来记录宝可梦
long long check1()//用来判断使用什么技能
{
long long temp,num;
if(max(0,q1.front().a-q2.front().c)>=max(0,q1.front().b-q2.front().d))//按题目模拟即可
{
temp=max(0,q1.front().a-q2.front().c);
num=1;//1表示使用物理攻击
}else
{
temp=max(0,q1.front().b-q2.front().d);
num=2;//2表示使用魔法攻击
}
if(q1.front().w>temp&&q1.front().en>=q1.front().e)
{
num=3;// 3表示使用真实伤害
}
return num;
}
long long check2()//同理上面
{
long long temp,num;
if(max(0,q2.front().a-q1.front().c)>=max(0,q2.front().b-q1.front().d))
{
temp=max(0,q2.front().a-q1.front().c);
num=1;
}else
{
temp=max(0,q2.front().b-q1.front().d);
num=2;
}
if(q2.front().w>temp&&q2.front().en>=q2.front().e)
{
num=3;
}
return num;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
long long h,a,b,c,d,e,w;
for(long long i=0;i<n;i++)
{
scanf("%d%d%d%d%d%d%d",&h,&a,&b,&c,&d,&e,&w);
q1.push({h,a,b,c,d,e,w,0});
}
for(long long i=0;i<m;i++)
{
scanf("%d%d%d%d%d%d%d",&h,&a,&b,&c,&d,&e,&w);
q2.push({h,a,b,c,d,e,w,0});
}
long long op=1;long long t;
for(long long i=0;i<k*2;i++)
{
if(op)//op=1表示当前是Alice在发动攻击
{
t=check1();
}else
{
t=check2();
}
if(q1.empty())
{
cout<<"Bob";
return 0;
}
if(q2.empty())
{
cout<<"Alice";
return 0;
}
if(t==1&&op)
{
q2.front().h-=max(0,q1.front().a-q2.front().c);//按照题目模拟即可
q1.front().en++;
}else if(t==2&&op)
{
q2.front().h-=max(0,q1.front().b-q2.front().d);
q1.front().en++;
}else if(t==3&&op)
{
q2.front().h-=q1.front().w;
q1.front().en-=q1.front().e;
}else if(t==1)
{
q1.front().h-=max(0,q2.front().a-q1.front().c);
q2.front().en++;
}else if(t==2)
{
q1.front().h-=max(0,q2.front().b-q1.front().d);
q2.front().en++;
}else if(t==3)
{
q1.front().h-=q2.front().w;
q2.front().en-=q2.front().e;
}
//归队
if(op)
{
A k=q1.front();
q1.pop();
q1.push(k);
if(q2.front().h<=0)q2.pop();//如果宝可梦死亡则出队
op=0;//每次处理完队伍情况后需要调换攻击顺序
}else
{
A k=q2.front();
q2.pop();
q2.push(k);
if(q1.front().h<=0)q1.pop();
op=1;
}
}
cout<<"Draw";
return 0;
}
K. RSP(签到)
题目链接
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<"1/"<<n;
}
L. 养成游戏(模拟+简单递归)
题目链接
AC代码
#include<bits/stdc++.h>
using namespace std;
const long long N=110;
long long n,m,k;
long long p[N];
long long sum;
long long ma=0;
struct A
{
long long i;long long j;long long op;long long a;long long b;long long d;long long v;
};
A res[N];
void dfs(long long u)
{
if(u==n+1)
{
sum=0;
for(long long i=0;i<m;i++)
{
if(res[i].op&&((res[i].a)*p[res[i].i]+res[i].b*p[res[i].j]>=res[i].d))
{
sum+=res[i].v;
}else if(!res[i].op&&(res[i].a*p[res[i].i]+res[i].b*p[res[i].j]<=res[i].d))
{
sum+=res[i].v;
}
}
ma=max(sum,ma);
return ;
}
for(long long i=0;i<=k;i++)
{
p[u]=i;
dfs(u+1);
}
}
int main()
{
cin>>n>>m>>k;
for(long long q=0;q<m;q++)
{
long long i;long long j;long long op;long long a;long long b;long long d;long long v;
cin>>i>>j>>op>>a>>b>>d>>v;
res[q].i=i;res[q].j=j;res[q].op=op;res[q].a=a;res[q].b=b;res[q].d=d;res[q].v=v;
}
dfs(1);
cout<<ma;
return 0;
}