信息学的一次小考试,非常惨重,虽然题目没有特别难的,但成绩真的十分惨重。
emm。。。这次比赛按难度来说是低于NOIP普及组的,但提高组大佬也只拿了192分(虽然是第一),我拿了个17名,都是骗分嘛。。。
第一题:
其实骗分也不错啊!输出个零。。。如果不是因为输入没有处理好,我也就不需要在这么多行代码中加个cout<<0;return 0;了;
这题是让你找在一个方阵中的一个被‘*’包围方阵的零的个数,输入比较恶心,找到一点进行深搜来做出。但你要判定没一个点,来深搜其实很简单,范围只有最多10行,最多每行100个字符。代码就草草带过:
#include<bits/stdc++.h>
using namespace std;
int ans=0,sum=0;
string b;
bool flag=0;
char c[20][300];
int a[20][300]={};
void dfs(int x,int y)
{
if(a[x][y+1]==16843009||a[x][y-1]==16843009||a[x+1][y]==16843009||a[x-1][y]==16843009)
flag=1;
sum=sum+1;
a[x][y]=2;
if(a[x-1][y]==4)
dfs(x-1,y);
if(a[x+1][y]==4)
dfs(x+1,y);
if(a[x][y+1]==4)
dfs(x,y+1);
if(a[x][y-1]==4)
dfs(x,y-1);
}
int main()
{
int n,m=0;
int len=0;
while(cin>>b)
{
int lo=b.size();
m=max(m,lo+1);
len++;
for(int i=0;i<=lo;i++)
c[len][i+1]=b[i];
}
n=len;
memset(a,1,sizeof(a));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(c[i][j]=='*')
a[i][j]=0;
if(c[i][j]=='0')
a[i][j]=4;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==4)
{
sum=0;
flag=0;
dfs(i,j);
if(flag==0)
ans+=sum;
}
cout<<ans;
}
我第二题输出个‘NO ANSWER’拿来了点分数(10分
第二题类似于解救公主,集训期间讲过
代码却忘了,毕竟不能查了资料,不过就这样了,代码网上多滴是;
第三题
在一列中找几个能被其余数整乘的积。。。
反质数(这话说的,不然还能没一个AC吗)
能拿部分分的代码自然是暴力了。。所以还是正解给吧(额,如果不是O2优化是不可能不超时的
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int a[1000010]={},b[1000010]={},c[1000010]={};
int main()
{
int n,m;
cin>>n;
int Max=-1;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
if (a[i]>Max) Max=a[i];
}
for(int i=1;i<=Max;i++)
{
if (b[i]>0)
for(int j=i;j<=Max;j=j+i)
c[j]=c[j]+b[i];
}
for(int i=1;i<=n;i++)
printf("%d\n",c[a[i]]-1);
return 0;
}
第四题。。。。先享受一下我的代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,i,k,a[5005],b[1000004];
long long j;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
j=1;
for(i=1;i<n-1;i++)
for(int l=1;l<n;l++)
for(int kk=1;kk<=n;kk++)
{
b[j]=a[i]+a[l]+a[kk];
j++;
}
for(i=1;i<=n;i++)
for(m=1;m<=j;m++)
{
if(a[i]==b[m])
{
k++;
m=j;
}
}
cout<<k;
return 0;
}
看完这个暴力代码,想必大家都明白思路了吧。。。
看懂代码后,猜题目吧:
#include <cstdio>
using namespace std;
const int MAXN = 5001;
const int M = 200000;
int n, a[MAXN], e[2*M+1];
inline int q(int b) { return e[b+M]; } // query
inline void u(int b) { e[b+M] = 1; } // update
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d", a+i);
int sol = 0;
for (int i = 0, ok = 0; i < n; ++i, ok = 0) {
for (int j = 0; j < i && !ok; ++j) ok = q(a[i]-a[j]);
for (int j = 0; j <= i; ++j) u(a[i]+a[j]);
sol += ok;
}
printf("%d\n", sol);
return 0;
}
谢谢观赏