您的位置:首页 > 其它

9.30 noip模拟试题

2016-09-30 20:03 351 查看
时限均为1s,内存 256MB

1、某种密码(password.*)

关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY。若KEY=∑▒〖Ai*Bi〗,则密文就是原文的一组合法密码。

现在有原文和钥匙码,请编一个程序来帮助他统计到底有多少个符合条件的密文。

【输入数据】

第一行两个数N,KEY,意义同题目描述;

第二行N个数表示原文A,意义同题目描述。

【输出数据】

一个数ANS,表示对于原文A和KEY,有多少组可行的密文B。

【输入样例】

3 2

1 1 2

【输出样例】

2

【样例说明】

密文110,1*1+1*1+0*2=2

密文001,0*1+0*1+1*2=2

一共两组可行的密文。

【数据约定】

60%数据满足N<=25

100%数据满足N<=40,-maxlongint<=∑▒Ai<=maxlongint

暴力+hash

/*本来能A的 但写wa了 这种题又没法拍 哎QAQ*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 1010
using namespace std;
int n,m,k,f[maxn][maxn],dis[maxn][maxn];
int x1,x2,y1,y2,ans,step;
struct node{
int x,y,s;
};
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
queue<node>q;
void Bfs(){
while(!q.empty()){
node t=q.front();q.pop();
dis[t.x][t.y]=t.s;
for(int i=0;i<4;i++){
int nx=t.x+xx[i];
int ny=t.y+yy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&f[nx][ny]==0){
f[nx][ny]=1;dis[nx][ny]=t.s+1;
q.push((node){nx,ny,t.s+1});
}
}
}
}
int Judge(int S){
if(dis[x1][y1]<S)return -1;//这里没考虑到
memset(f,0,sizeof(f));
f[x1][y1]=1;
while(!q.empty())q.pop();
q.push((node){x1,y1,0});
while(!q.empty()){
node t=q.front();q.pop();
if(t.x==x2&&t.y==y2)
return t.s;//开始wa的时候是返回01 并且直接改
for(int i=0;i<4;i++){
int nx=t.x+xx[i];
int ny=t.y+yy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&f[nx][ny]==0&&dis[nx][ny]>=S){
f[nx][ny]=1;
q.push((node){nx,ny,t.s+1});
}
}
}
return -1;
}
int main()
{
freopen("escape.in","r",stdin);
freopen("escape.out","w",stdout);
scanf("%d%d%d",&k,&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;x2++;y1++;y2++;
int x,y;
memset(dis,127/3,sizeof(dis));
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&y);
x++;y++;
q.push((node){x,y,0});
f[x][y]=1;dis[x][y]=0;
}
Bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%d ",dis[i][j]);
printf("\n");
}
int l=0,r=maxn*maxn;
while(l<=r){
int mid=(l+r)/2;
int tmp=Judge(mid);
if(tmp!=-1){
l=mid+1;ans=mid;
step=tmp;
}
else r=mid-1;
}
printf("%d %d\n",ans,step);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: