今天上的是广搜。因为座位移了,所以看得更清楚,听得也懂了一些。
深搜就是求解,而广搜是求最优解。所以其实是有很大不同的。
今天的考题,第一题很简单,但是还是有人爆零。我只对了第一题。
第一题——构造回文串
描述:
小A有n种字符,其中第i种字符有ai个,现在小A想知道能否用上他拥
有的所有字符构造一个回文串。输入第一行一个正整数��,接下来一行��个正整数����如题意所述。输出一行YES表示他能做到,NO表示不能。数据规模:对于100%的数据:1 ≤ �� ≤ 100, 1 ≤ ���� ≤ 100。
解:
在读入n之后,循环读入ai,记录ai为奇数的个数有几个。如果奇数个数小于等于1,则输出“YES”,否则输出“NO”。
看思路就是很简单,所以错的都是马虎吧。有的是因为题目没看清,将“YES”“NO”写成了小写,还有的是因为把文件输入输出注释掉,提交的时候没有把斜杠删了。所以要注意啊。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("palindromic.in","r",stdin);
freopen("palindromic.out","w",stdout);
int n,i,j,a,s=0;
cin>>n;
for (i=1;i<=n;i++)
{
cin>>a;
if (a%2!=0) s++;
}
if (s==1||s==0) cout<<"YES"<<endl;
else if (s>1) cout<<"NO"<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
第二题——矩阵编码
题目:
有一个边长为��(�� = 2��)的正方形矩阵,其中元素均为0或1,如下方左图所示。
老师说这一题其实没有多大难度。只要把模板套一下就好了。然后在此放上老师的程序:
#include<bits/stdc++.h>
using namespace std;
const int N=522, M=N*N*2;
//char hexdigit[17]="0123456789ABCDEF";
int n,qx[M]={},qy[M]={},l[M]={},head=0,tail=0;
int a[N][N]={},s[N][N]={},len=0;
char ch[M]={};
int main()
{
freopen("coding.in","r",stdin);
freopen("coding.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
len=0;
head=tail=0;
++tail;
qx[tail]=1,qy[tail]=1,l[tail]=n;
while(head!=tail)
{
++head;
int sx=qx[head], sy=qy[head], sl=l[head];
int sum=s[sx+sl-1][sy+sl-1]-s[sx+sl-1][sy-1]
-s[sx-1][sy+sl-1]+s[sx-1][sy-1];
if(sum==sl*sl)
{
ch[++len]='0';
ch[++len]='1';
continue;
}
if(sum==0)
{
ch[++len]='0';
ch[++len]='0';
continue;
}
ch[++len]='1';
int nl=sl/2;
++tail;
qx[tail]=sx,qy[tail]=sy,l[tail]=nl;
++tail;
qx[tail]=sx,qy[tail]=sy+nl,l[tail]=nl;
++tail;
qx[tail]=sx+nl,qy[tail]=sy,l[tail]=nl;
++tail;
qx[tail]=sx+nl,qy[tail]=sy+nl,l[tail]=nl;
}
ch[++len]=0;
puts(ch+1);
}
fclose(stdin);
fclose(stdout);
}