这道题不难,
直接双重循环扫一遍数组
看看有没有 ‘.’ 周围是有3个及以上 ‘X’ 就好了。
至于为什么。。。
因为如果有三个点及以上,就代表是一条直线被堵住了
这样显然是回不了头的。
然后就A了
100 p t s 100pts 100pts !
A C C o d e AC~Code AC Code
#include
#include
#include
#include
using namespace std;
int a[55][55],n,m,tj;
char c;
int main()
{
freopen("okret.in","r",stdin);
freopen("okret.out","w",stdout);
memset(a,1,sizeof(a));
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>c;
if(c=='.')
a[i][j]=0;
else
a[i][j]=1;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
tj=0;
if(a[i][j]==0)
{
if(a[i+1][j]!=0)
tj++;
if(a[i-1][j]!=0)
tj++;
if(a[i][j+1]!=0)
tj++;
if(a[i][j-1]!=0)
tj++;
if(tj>2)
{
cout<<1;
return 0;
}
}
}
cout<<0;
return 0;
}
没做出来。。。
正解:有技巧的模拟
第一组数据用数组存起来,
第二组数据输入一个就将这个数就与
其它数辗转相除,
然后判断一下就AC了。
A C C o d e AC~Code AC Code
#include
#include
#include
using namespace std;
long long b,c,ans=1,n,m,f;
long long a[1110];
long long ys(long long x,long long y)
{
if(x%y==0)
return y;
else
return ys(y,x%y);
}
int main()
{
freopen("zadaca.in","r",stdin);
freopen("zadaca.out","w",stdout);
scanf("%lld",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
scanf("%lld",&m);
for(int i=1; i<=m; i++)
{
scanf("%lld",&b);
for(int j=1; j<=n; j++)
{
c=ys(a[j],b);
if(ans*c>=1000000000)
f=1;
ans=ans*c%1000000000;
a[j]/=c,b/=c;
}
}
if(f==1)
printf("%09ld",ans);
else
printf("%lld",ans);
return 0;
}
没做出来,
正解:二分
为啥我没想到!?
A C C o d e AC~Code AC Code
#include
#include
#include
#include
using namespace std;
int n,m;
int ans,l,r,mid,b,pow_of2[100010];
struct node
{
int x,y;
}a[100010];
bool cmp(const node&l,const node&r)
{
return l.x<r.x;
}
int main()
{
freopen("sfxx.in","r",stdin);
freopen("sfxx.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i].x);
a[i].y=i;
}
sort(a+1,a+n+1,cmp);
pow_of2[1]=2;
for(int i=2; i<=n; i++)
pow_of2[i]=pow_of2[i-1]*2%1000000007;
for(int i=1; i<=m; i++)
{
scanf("%d",&b);
l=1,r=n;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid].x==b)
{
ans=(ans+pow_of2[a[mid].y])%1000000007;
break;
}
if(a[mid].x>b)
r=mid-1;
else
l=mid+1;
}
}
printf("%d",ans);
return 0;
}
也没做出来。。。
正解:状压?+位运算+容斥
二进制真是个好东西
A C C o d e AC~Code AC Code
#include
#include
#include
using namespace std;
long long n,b[1000010],k,ans,s,x;
int main()
{
freopen("kompici.in","r",stdin);
freopen("kompici.out","w",stdout);
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&x);
s=0;
while(x>0)
{
k=x%10;
x=x/10;
s=s|(1<<k);
}
b[s]++;
}
for(int i=1; i<=1023; i++)
{
if(b[i]==0)
continue;
for(int j=1; j<=1023; j++)
{
if(!(i&j)||b[j]==0||i==j)
continue;
ans=ans+b[i]*b[j];
}
ans=ans+b[i]*(b[i]-1);
}
printf("%lld",ans/2);
return 0;
}
100 + 0 + 0 + 0 = 100 p t s 100+0+0+0=100pts 100+0+0+0=100pts