枚举
一、例题
【noip2008提高】火柴棒
首先,我们先要判断出一种情况,例如:
11 + 1 = 12
4 2 2 2 7 17
然后先把所有数字出现的火柴棒数量给列举出来:
6,2,5,5,4,5,6,3,7,6
然后就使用for循环枚举出来:
for (int i=10;i<=2222;i++)
stick[i]=stick[i/10]+stick[i%10];
答案代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[2500]={6,2,5,5,4,5,6,3,7,6};
int main()
{
int i,b,k,m,n,p,q,x,y,z,ans;
cin>>n;
n-=4;
for (i=10;i<=2222;i++)
{
x=0;
p=i;
while (p)
{
x+=a[p%10];
p/=10;
}
a[i]=x;
}
ans=0;
for (i=0;i<=1111;i++)
for (b=0;b<=1111;b++)
if(a[i+b]+a[i]+a[b]==n) ans++;
cout<<ans<<endl;
return 0;
}
亲和数暂时不会
牛式
牛式这道题就更加暴力了,原题上一共有5个XX,所以就需要用一个五重循环:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
a[++cao]=c[i]*100+c[j]*10+c[k],fa[a[cao]]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[++giao]=c[i]*10+c[j];
for(int i=1;i<=cao;i++)
for(int j=1;j<=giao;j++)
if(jinkela(a[i],b[j])) ans++;
这些是循环部分
所以,这道题就这么解出来了,代码有亿一点长,就省略了
破碎的项链
这道题就比较麻烦了
bbrrrbbbbrrrbb
bbrrrbb
brrrbbb
rrrbbbb
rrbbbbr
rbbbbrr
bbbbrrr
bbbrrrb
起点为i,终点为 i+n-1:
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
连续累加和
累加和 sum
最小的长度 len >=l
for (int len=l;len<=100;len++)
{
len这个值是确定的
}
等差数列 略
再见