ACM第一周及第一周

  • while(scanf("%d")!=EOF)
  • hash
  • 素数打表
  • 自学内容:前缀和

一:while(scanf("%d")!=EOF)
当题目中未给出明确的输入数据数量时,可以用这种方法来输入直到数据全部输入完成。
ps:这一行代码即可表示第一次输入。
二:hash(哈希)
即“标记”思想,可以设另外一个数组b,用这个b数组来对原来的数组中的各个元素进行标记进而简化运行时间,当想要对原来的数组进行操作时,可以对b数组中的元素进行判断。
eg:
询问a数组中是否有7

int a[1,2,3,4,5,7,8,60,0];
int b[1,2,3,4,5,6,7...,60];//省略了中间的,正常应该使用循环来赋值
for(i=0;i<=60;i++)
	b[a[i]]++;//对a数组中出现过的元素在b中进行标记

这样之后想询问是否有7便不用一个一个的循环判断了,只要判断b数组中b[6]是否为0即可。
三:素数打表
要寻找某个区间里的素数,这里有一种相对简单的做法,也同样运用了标记的思想,下面看代码

int a[1000000]={0};
for(j=2;j<=1000000;j++)
{
	if(a[j]==0)
		for(i=j+j;i<=1000000;i+=j)
			a[i]=1;
}

如果一个数是另一个数的倍数,那么它一定不是素数,根据这个原理,这段代码将从2到1000000的所有素数进行了标记,之后如果想判断一个数是否是素数,只判断a[j]是否等于0即可;
对于这段代码,这里还有一种更能减少时间复杂度的方法,即将i=j+j改为i=j×j,将i+=j改为i×=j,结果是一样的,当j为300,i变为200时与j为200,i为300时的运行程序是一样的,所以用乘法替换了加法来减少时间复杂度。
四:自学内容:前缀和
前缀和就相当于一个数列an的前n项和Sn,把这个数列的每一项所对应的Sn求出来即是前缀和。
例如,让我们求一个数列从n1项到n2项的所有数的和,我们只要把n2处的前缀和减去n1处的前缀和即可求解。对于一个二维数列,我们也可以用同样的思路,但是这里要将这个二维数列想象成一个长方形或正方形,前缀和即是面积,要求某个范围内的数的和,只要将面积相加减即可,但一定要注意面积可能会重复的问题。
QAQ以上内容为原创,仅为个人见解,如有错误欢迎批评指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值