当时比赛的时候看到200ms以为很难,以致于后面决定用BFS写的时候一直觉得会超时,就不是很用心。但最终发现居然这样做是对的,而且时间也仅仅只有15ms。
可惜了吧,其实分析下便知道BFS应该是不会超时的~
比较简单,直接枚举模拟即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,m,k;
int pos[17],val[17];
struct node
{
int p[17];
int val;
};
int main()
{
int cas,cass=1;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
scanf("%d",&pos[i]);
for(int i=0;i<n;i++)
scanf("%d",&val[i]);
node ita;
for(int i=0;i<n;i++)
ita.p[i]=val[i];
ita.val=0;
queue<node> q;
while(!q.empty())
q.pop();
q.push(ita);
int ans=0;
bool isans=0;
for(int i=0;i<k;i++)
{
int ita,itb,itc,flag;
scanf("%d%d%d",&ita,&itb,&itc);
while(!q.empty())
{
node f=q.front();
if(f.val!=i)
break;
q.pop();
node it=f;
if(it.p[itb]+2<=5&&it.p[itc]+2<=5)
{
it.p[ita]-=2;
if(it.p[ita]<1)
it.p[ita]=1;
it.p[itb]+=1;
it.p[itc]+=1;
flag=0;
for(int j=0;j<n;j++)
{
if(pos[j]==pos[itb]||pos[j]==pos[itc])
{
it.p[j]++;
if(it.p[j]>5)
{
flag=1;
break;
}
}
}
it.val=i+1;
if(!flag)
q.push(it);
}
it=f;
if(it.p[ita]+2<=5&&it.p[itc]+2<=5)
{
it.p[itb]-=2;
if(it.p[itb]<1)
it.p[itb]=1;
it.p[ita]+=1;
it.p[itc]+=1;
flag=0;
for(int j=0;j<n;j++)
{
if(pos[j]==pos[ita]||pos[j]==pos[itc])
{
it.p[j]++;
if(it.p[j]>5)
{
flag=1;
break;
}
}
}
it.val=i+1;
if(!flag)
q.push(it);
}
it=f;
if(it.p[ita]+2<=5&&it.p[itb]+2<=5)
{
it.p[itc]-=2;
if(it.p[itc]<1)
it.p[itc]=1;
it.p[ita]+=1;
it.p[itb]+=1;
flag=0;
for(int j=0;j<n;j++)
{
if(pos[j]==pos[ita]||pos[j]==pos[itb])
{
it.p[j]++;
if(it.p[j]>5)
{
flag=1;
break;
}
}
}
it.val=i+1;
if(!flag)
q.push(it);
}
}
if(q.empty()&&!isans)
{
isans=1;
ans=i;
}
}
if(!q.empty())
ans=k;
printf("Case #%d: %d\n",cass++,ans);
}
return 0;
}