0
点赞
收藏
分享

微信扫一扫

2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)

芷兮离离 2023-06-10 阅读 73
算法

 A

#todo

 B

//todo

"""
CUT
这道题采用dfs按切割长度搜出来每一种的切割方案
"""


n=input()

ls=[] #作为dfs里的迭代变量,因为会随着递归而改变
bc=[] #用来保存数据
def dfs(s):
    if len(s)<1:
        bc.append(ls.copy())  #在python里赋值会让两个变量指向同一个内存地址,所以如果采取赋值的操作,bc会因ls改变而改变
        return
    if len(s)==1:
        ls.append(s)
        bc.append(ls.copy())  #回溯最重要的一点,怎么来的怎么回去,在line22进行dfs(5)之前,此时的ls=['1','2'],在dfs(5),的时候会因为len(s)==1而改变为ls=['1','2','5'],所以要进行删除操作
        ls.pop()
        return
    for i in range(1,len(s)+1):
        ls.append(s[0:i])
        dfs(s[i:len(s)])
        ls.pop()
dfs(n)
ans=0
#最后将bc保存的值相加
for i in bc:
    for j in i:
        ans+=int(j)
print(ans)

 D

 

/*
Diff
这题排列组合,可以通过规律找到排列组合的公式,也可以dfs
1.公式
第一个盒子有k种选取方式,因为不可以与上一个盒子内的东西相同,所以有k-1种,之后的盒子也是如此
所以有k*(k-1)*……*(k-1)中间为(n-1)个(k-1)
即k*(k-1)**(n-1)
2.dfs
搜索每一个物品的分支
例如
        A
       / \
      B   C
     /\   /\
    C  A A  B
BCD以此类推
*/

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, k, ans;

void dfs(int u, int cnt)
{
    if (cnt == n) // 当数量==n时回溯
    {
        ans++;
        return;
    }
    for (int i = 1; i <= k; i++)
    {
        if (i != u) // 只有下一件物品与上一件不同时才往下一层递归
            dfs(i, cnt + 1);
    }
}

int main()
{
    cin >> n >> k;
    // 搜索每一个物品的分支
    for (int i = 1; i <= k; i++)
        dfs(i, 1);
    cout << ans << endl;
}

E

"""
EchoN
可以采取kmp,也可以采取双指针
"""


s = input()

res = len(s)
#因为要求前缀,那么aaba也就是从开始一直到结尾,从长度为1到len(s),都是aaba的前缀
# [1, 1]:a
# [1, 2]:aa
# [1, 3]:aab
# [1, 4]:aaba

#下面这个操作是为了求字符串中间是否存在有相同的前缀
#以niconiconi为例
#在i==4即s[4]=n之前while一直处于不成立状态,当i==4时,n==s[start],所以res+1,i也+1,这是为了继续匹配看后面还有多少相同的前缀,
# 当不再匹配的时候,for从此时的i继续进行循环,因为之前的情况都已排查好了,所以继续往后搜就可以了
for i in range(1, len(s)):
    start = 0  #start表示前缀的末尾,初始为0
    while i<=len(s)-1 and s[i] == s[start]:
        res += 1
        i += 1
        start += 1
print(res)

 F

//todo

 G

//todo

 H

//todo

 I

a = list(map(int, input().split()))
s = sum(a)
if s > 0:
    print("IMissYou!")
    print(s)
else:
    print("0v0")

 J

//todo
举报

相关推荐

0 条评论