比赛 |
20121106 |
评测结果 |
AAAWWWWWWWWWWWW |
题目名称 |
二十一点 |
最终得分 |
20 |
用户昵称 |
Truth.Cirno |
运行时间 |
0.009 s |
代码语言 |
C++ |
内存使用 |
2.94 MiB |
提交时间 |
2012-11-06 11:57:16 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,num[1010],maxwin;
bool rec[1010];
void work(void)
{
int i,yours,mine,win=0;
bool youhaveright,Ihaveright;
for (i=1;i+5<=n;)
{
yours=0;
mine=0;
youhaveright=true;
Ihaveright=true;
if (rec[i]==0&&rec[i+1]==1&&rec[i+2]==0&&rec[i+3]==1)
{
yours+=num[i++];
mine+=num[i++];
yours+=num[i++];
mine+=num[i++];
}
else
{
return;
}
while (i<=n)
{
if (youhaveright&&yours<=16)
{
if (rec[i]==0)
yours+=num[i++];
else
return;
if (yours>21)
{
win++;
break;
}
if (i>n)
{
if (mine>yours)
win++;
break;
}
}
else
{
youhaveright=false;
}
if (Ihaveright)
{
if (youhaveright)
{
if (rec[i]==1)
{
mine+=num[i++];
}
else
{
Ihaveright=false;
continue;
}
if (mine>21)
{
break;
}
if (i>n)
{
if (mine>yours)
win++;
break;
}
}
else
{
if (mine>yours)
{
win++;
break;
}
if (rec[i]==1)
{
mine+=num[i++];
}
else
{
Ihaveright=false;
break;
}
if (mine>21)
{
break;
}
if (mine>yours)
{
win++;
break;
}
if (i>n)
break;
}
}
else
{
if (!youhaveright)
{
if (mine>yours)
win++;
break;
}
}
}
}
maxwin=max(maxwin,win);
}
void dfs(int deep)
{
if (deep>n)
{
work();
return;
}
rec[deep]=0;
dfs(deep+1);
rec[deep]=1;
dfs(deep+1);
}
int main(void)
{
freopen("jack.in","r",stdin);
freopen("jack.out","w",stdout);
int i;
cin>>n;
for (i=1;i<=n;i++)
cin>>num[i];
if (n>20)
{
int yours,mine,win=0;
bool youhaveright,Ihaveright;
for (i=1;i+5<=n;)
{
yours=0;
mine=0;
youhaveright=true;
Ihaveright=true;
yours+=num[i++];
mine+=num[i++];
yours+=num[i++];
mine+=num[i++];
while (i<=n)
{
if (youhaveright&&yours<=16)
{
yours+=num[i++];
if (yours>21)
{
win++;
break;
}
if (i>n)
{
if (mine>yours)
win++;
break;
}
}
else
{
youhaveright=false;
}
if (Ihaveright)
{
if (youhaveright)
{
mine+=num[i++];
if (mine>21)
{
mine-=num[--i];
Ihaveright=false;
}
if (i>n)
{
if (mine>yours)
win++;
break;
}
}
else
{
if (mine>yours)
{
win++;
break;
}
mine+=num[i++];
if (mine>21)
{
i--;
break;
}
if (mine>yours)
{
win++;
break;
}
if (i>n)
break;
}
}
else
{
if (!youhaveright)
{
if (mine>yours)
win++;
break;
}
}
}
}
cout<<win<<endl;
}
else
{
rec[1]=0;
dfs(2);
rec[1]=1;
dfs(2);
cout<<maxwin<<endl;
}
return(0);
}