AtCoder Beginner Contest 306(4/8)
2023-06-17 23:20 作者:Pinkword777 | 我要投稿
A.签到

把一个字符串翻倍,每个字符输出两次即可。
B.模拟

模拟二进制乘法,每次输入一个数(0或1),1就乘上当前2的次方,记录总和即可。(我开了unsigned long long)
C.模拟

从头到尾,按顺序输出出现正好两次的数即可。
D.DP

题意:
一个人从头到尾走完1~n格,每个格上有个吃的,有毒或无毒,并且有一定美味度,他每走到一个格子上可以选择吃或不吃。
一个人有两个状态,健康或不健康。
健康状态下,吃完有毒的,会变得不健康。
不健康状态下,吃完有毒的会直接死掉,吃完没毒的会解毒变成健康的。
那么状态转移方程为:
(0表示健康,1表示不健康)
食物无毒:
f[i][0]=max({f[i-1][0]+a[i].second,f[i-1][1]+a[i].second,f[i-1][0]});
//健康只能从 健康+吃/不吃 或者 不健康+吃
f[i][1]=f[i-1][1];
//不健康只能从 不健康来
食物有毒:
f[i][0]=f[i-1][0];
//健康只能从 健康来
f[i][1]=max(f[i-1][0]+a[i].second,f[i-1][1]);
//不健康只能从 健康+吃或者 不健康+不吃来
代码截图:
A.

B.

C.

D.

碎碎念:
E题没看懂题,跟队友一起打的,听他们说是树状数组,不太熟,题意也不太懂,然后就没看了
今天状态还不错
C题读假题浪费了十几分钟,可惜
总之放假前不会再经常打了,偶尔打打这种简单的还可以