#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll f1,f2,f3;
ll tmp;
f1=f2=f3=1;
for(int i=4;i<=20190324;i++)
{
tmp=(f1+f2+f3)%10000;//这个题只看数的最后四位就可以
f1=f2;
f2=f3;
f3=tmp;
}
cout<<tmp<<endl;
}
//这个题让输出结果的最后四位,防止溢出mod定位只处理最后四位
//注意long long
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int level=1;//层数
ll MAX=a[1];
ll ans=1;//第一层
int num=1;//该层的节点数
int pos=2;//下一层开头指针位置
while(1)
{
level++;
num*=2;
ll sum=0;
for(int j=pos;j<=min(pos+num-1,n);j++)sum+=a[j];
if(sum>MAX)
{
ans=level;
MAX=sum;
}
pos=pos+num;
if(pos>n)break;
}
printf("%lld\n",ans);
return 0;
}
//完全二叉树 需要定位层数 指针位置 层中结点数量
//跳出层总和的条件
#include <stdio.h>
int num[3][4];
int sum = 0;
bool isFilled[10];
int abs(int n)
{
return n >= 0 ? n : -n;
}
// 在num[r][c]处防止i符合规则则返回true
bool isLegal(int r, int c, int val)
{
if( r == 0 && c == 0 )
return true;
else if( r == 0 )
return abs(val-num[r][c-1]) > 1;
else if( c == 0 )
return abs(val-num[r-1][c]) > 1 && abs(val-num[r-1][c+1])>1;
else if( c != 3 )
return abs(val-num[r][c-1]) > 1 && abs(val-num[r-1][c]) > 1 && abs(val-num[r-1][c-1])>1 && abs(val-num[r-1][c+1])>1;
else
return abs(val-num[r][c-1]) > 1 && abs(val-num[r-1][c]) > 1 && abs(val-num[r-1][c-1])>1;
}
void dfs(int r, int c)
{
if( r == 2 && c == 3 )//出口条件
{
sum++;
return;
}
for(int i=0;i<=9;i++)
{
if( !isFilled[i] && isLegal(r, c, i) )
{
num[r][c] = i;
isFilled[i] = true;
dfs( r + (c+1)/4, (c+1)%4 );//子节点
isFilled[i] = false;//回溯
}
}
}
int main()
{
num[0][0] = -10;
num[2][3] = -10;
for(int i=0;i<10;i++)
isFilled[i] = false;
dfs( 0, 1 );
printf("%d\n", sum);
return 0;
}
关于二进制数的左移右移 以及位运算
深搜
dp