开学第七周总结

这周的话由于从线上改为线下教学,时间的分配不如原来那么充足。所以也调整了一下自己的学习计划。这周的话是这样安排的:如果有大块的时间(比如每天晚上或者是有空课的时候)就做一做洛谷上的搜索题,如果比较零碎的时间,就看一看思维题。

先说搜索:

1.​​​​​​[COCI2019-2020#1] Lutrija - 洛谷

这个题首先是对素数的理解:如果两个数都是素数,那么有两种情况:一奇一偶或者是两个奇数。

如果是两个奇数的情况:由于题目要求两数之差为素数,而两个奇数之差为偶数,所以只能为2。

如果是一奇一偶的情况:其中偶数必定为2。综上,要找的素数仅可能在所给素数a的[a-2,a+2]中。

对于搜索的设定:对于两个奇数的情况:可以对2,a-2,a+2每种可能作为下一层搜索的一种方案来进行递归。对于一奇一偶的情况:如果两者之差为素数,则可以直接输出。如果两者之差不是素数,只能判断结果+2的情况。

2.[USACO06FEB]Backward Digit Sums G/S - 洛谷

这个题涉及到了杨辉三角的一些结论:

以下为代码实现:

pc[0]=pc[n-1]=1
 if (n>1)
        for (int i=1;i*2<n;i++)
            pc[i]=pc[n-1-i]=(n-i)*pc[i-1]/i;

 这个题我一开始的构想是设计一个类似于数组传地址的递归,但后来看完题解后发现不用。只需要设计三个指数:已经枚举的数量,当前值,当前和。如果满足题意的话,只需要用一个数组记录当前值就可以,而不需要把它当做一个整体去进行递归。如果枚举当前和的大小已经大于所给值,则可以直接剪枝。

再说思维:

1.C. 她的名字 - EOJ Monthly 2018.12 - ECNU Online Judge

这个题也和杨辉三角有关,用了另一个结论:C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1}

以下为代码实现(也即本题的预处理部分):

for(int i=0;i<=2000;i++){
    c[i][0]=1;
}

for(int i=1;i<=2000;i++){
    for(int j=1;j<=i;j++){
        c[i][j]=(c[i-1][j]%mod+c[i-1][j-1]%mod)%mod;
    }
}}

这个题可以直接从00-99暴力枚举出所有可能结果,以下为核心代码还有我写的注释:
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++){
    ll cnt=0;
    for(int k=len-1;k>=0;k--){
        if(s[k]=='0'+j){
            cnt++;
        }
        if(s[k]=='0'+i){
            for(int l=2;l<=k+2;l++){
                if(i==j)
                    ans[l][i*10+j]=(ans[l][i*10+j]+(c[cnt-1][1]*c[k][l-2]%mod)%mod);//因为选定结尾,所以从后往前遍历。在当前值后面在cnt中选一个(c[cnt-1][1]),当前值(*1),在当前值前随便选一个(c[k][l-2])

else ans[l][i*10+j]=(ans[l][i*10+j]+(c[cnt][1]*c[k][l-2]%mod)%mod);
            }
        }
    }}

2.Problem - 1040B - Codeforces

这个题的思路很有意思:首先让第一个翻面,再让每隔2*k个翻面一次,由于第一个烤串已经翻了k个,所以剩下还没有翻过的一定小于或等于k。这样的话如果没有正好最大程度翻面的话,翻面的总数加一即可,而第一个翻面的点可以这样选择(n%(2*k+1))/2+1,每次加2*k+1;

3.Problem - C - Codeforces

这个题涉及到位运算的一些知识:

&:相同位的两个数字都为1,则为1;若有一个不为1,则为0;

|:相同位只要一个为1即为1;

假设答案为A,这个题可以暴力枚举0-2^9-1,是否对于每个i,都存在j,使得(ai&bj)|A=A;

4.Problem - 1284B - Codeforces

这个题很巧妙的是创建了两个vector,一个记录序列最大值,一个记录序列最小值。只需要给最大值排序,遍历最小值数组。对于每一个最小值,在最大值数组里面找值,如果最小值<最大值(可以用upper_bound来实现),答案即为当前最大值的位置到末尾有多少个数累加起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值