1.加分二叉树
这是一道NOIP真题
主要考察了分治与记忆化搜索
难点:
如何记录父亲节点
收获:
可以利用区间左右端点记录该区间的一些特殊值
2.守望者的逃离
这题可以一题多解:如dp,贪心,终态枚举等
主要研究贪心
难点:
如何平衡两种决策
收获:
当有两种决策的时候不妨记录两个方案各自的值,
然后时刻取最优解
部分代码:
while(--t){
if(M>=10)now+=60,M-=10;
else M+=4;
now1+=17;
if(now>now1)now1=now;
if(now1>=S)break;
}
3.问答
由于快速幂的原因,错误了n次。。
收获:快速幂一定要打long long!!!
代码:
#include<cstdio>
#define Mod 1000000009
#define ll long long
ll Fast(ll x,ll n){
ll res=1;
while(n){
if(n&1)res=res*x%Mod;
x=x*x%Mod;
n=n>>1;
}
return res;
}
//贪心显然:尽量使前面翻倍,后面不翻倍
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int res=n-m;//打错题数
int mx=n/k;//最多连续
ll ans=0;
if(res>=mx){//可以不翻倍
ans=m;
}
else {
ans+=1LL*k*Fast(2,mx-res+1)%Mod;//不被拆开 k*2^(mx-res+1)-k*2
ans+=m-(mx-res)*k-k*2;
ans=(ans%Mod+Mod)%Mod;
}
printf("%lld\n",ans%Mod);
return 0;
}