神马是枚举呢??
答:也叫穷举,就是把所有的可能全部找到,然后呢,判断就好啊,然后呢,分就来了啊,哈哈哈,是不是很简单感觉,诚然是你想的那样,但仍有很多特殊情况的,比如,有很多的时候,因为时间复杂度我们会受到很大的限制,有一种人叫做荷兰人,有一种数据只为卡死你,so,我们有很多地方需要注意一下,我把自己理解的一些打一下,然后也欢迎大家及时补充。
设置下标,并及时标注,一个数组就可以囊括大部分的下标变量,并且可以减少多余的判断和循环,我们只需要用0或1来代替或者是bool型的下标变量循环判断就好,
e.g.for(i=1;i<=9;i++)
book[i]=0;
for(i=1;i<=9;i++)
book[a[i]]=1;
sum=0;
for(i=1;i<=9;i++)
sum+=book[i];
if(sum==9)//出现了九个不同的数字。并且满足等式条件。
方向判断,我们利用循环,在已知且固定的方向上移动比如四个方向或者八个方向。经历四到八次的循环来判断,这将可以为我没自己的获得更为简单的思想和思路,如果你认为敲八遍代码很麻烦,那你知道COPY吗??可以考虑发现其他的问题和这个的几点不同,只是做出简单的改变而已,这也就是大神们常说的以空间换取时间。
e.g.
题目描述:小时候玩过的炸弹人,通过放炸弹来判断怎样炸死的敌人最多,G为敌人,“.”为空地,“#”为墙。
实现代码如下:
#include<stdio.h>
#include<algorithm>
int main(){
char a[20][21];
int i,j,sum,map=0,p,q,x,y,n,m;
cin>>n;
for(i=0;i<=n-1;i++)
cin>>a[i];
for(i=0;i<=n-1;i++)
{
for(j=0;j<m-1;j++)
{
if(a[i][j]=='.')
{
sum=0;
x=i;y=j;
while(a[x][y]!='#')
{
if(a[x][y]='G')
sum++;
x--;
}
x=i;y=j;
while(a[x][y]!='#')
{
if(a[x][y]='G')
sum++;
x++;
}
x=i;y=j;
while(a[x][y]!='#')
{
if(a[x][y]='G')
sum++;
y--;
}
x=i;y=j;
while(a[x][y]!='#')
{
if(a[x][y]='G')
sum++;
y++;
}
if(sum>map)
{
map=sum;
p=i;
p=j;
}
}
}
}
cout<<p<<","<<q<<" "<<map;
getchar();getchar();
return 0;
}
- 我们可以碰到很多需要我们判断的地方,但其实有一些量我们可以通过其他的量来判断出来,比如A+B=C我们其实只需要循环A和B,将C通过一个简单的加法来判断,这就使得由原来的ON的三次方变为ON的二次方。就是这般完美。
总结:在NOIP中,我们有很多的机会可以骗分,分数就简简单单的来了,而枚举则是骗分的一种极为简单的方式。
编者自述:求解:一种不含巧克力,不含奶油,不要特别甜的,不要特别苦的,奶多的不要,奶少的不要的东西是什么呢??要好吃的,咖啡或者甜点