信息学小考

信息学的一次小考试,非常惨重,虽然题目没有特别难的,但成绩真的十分惨重。

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;

}

谢谢观赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值