赛后总结
T1
从代码和思路的层面来说都不算难,仅需特判n=m=1的情况。
我最初这么思考:不妨设m>=n,当n=1且m>1的时候与n=2且m>=2的时候均是January获胜;在n>=3,m>=3时,从奇偶的角度分析,考虑转化到已推出的状态。但是难以发现普遍规律,我最后猜结论歪打正着。
T2
正解运用了扩展欧几里得算法,得出一次不定方程的解然后在通解中取最小值。
考场思路:很容易知道,最后喝的水量C一定是A,B的线性组合,即AX+BY=C。这是一次不定方程,其形式与裴蜀定理的形式ax+by=gcd(a,b)相同。直接运用辗转相除法(即扩展欧几里得算法)求gcd(A,B),在求的过程中记录带余除法中 a=bq+r的 q,求得最大公约数后递推求不定方程的X,Y,求的过程如下:
//默认 a>b
int q[100010],cnt=0;
q[0]=1;//初始化使递推公式一般化
void exgcd(int a,int b){
if(a%b==0){
return;
}
int qi=a/b,ri=a%b;
exgcd(b,ri);
cnt++;
q[cnt]-=qi*q[cnt-1],q[cnt+1]+=q[cnt-1];
}
求得不定方程的解后,我推断答案的大小于|X|+|Y|有关,却没有推出 ANS=MAX(2|X+Y|,2|X-Y|-1) ,同时我也不确定求通解中最小值的范围,最后只能作罢,写了骗分代码。
T3
一眼DP。
状态转移方程不难,也非常好推,但我不了解期望的定义与性质,整题放弃。
赛后重做:由于在每一次施展魔法时,有两种BUFF可选,很明显就是将两种BUFF进行比较取最大值。
令 E[i]表示有i点魔力的情况下最优期望施展E[i]次魔法。
则 E[i]=MAX(1+P%+E[i-B],(Q%) E[i-B-1]+(1-Q%) E[i-B]);
T4
正解运用字符串Hash,打算晚上了解一下
我打这道题的时候仅剩10分钟,为了骗分,写了暴力代码30pts.