2020牛客多校第五场DEI题解

F. DPS

签到。题意为将给定的数据用横向条形图画出来。

I. Hard Math Problem

题意

的网格,每个网格可以放置H、G、E中的一种,要求H旁边必须至少相邻一个G和E,求 当区域趋于无穷大时最大的放置H的数量。

解题思路

最开始想的交叉放置,这样最大利用率趋近,之后的思路是所有的区块都按照3*3放置,利用率是。但这两种方法都WA了。
正确思路:利用率达到最大时,每个G和E都被旁边的四个H利用,那么理想状态下,G:E:H=1:1:4,即结果为

/*
GHHGHHGHHGHH
HHEHHEHHEHHE
HGHHGHHGHHGH
EHHEHHEHHEHH
*/

E. Bogo Sort

题意

有一个的某个排列,给定一个变换序列p[i],每次替换时将数组中每个元素a[i]替换成a[p[i]]。问最多替换多少次可以将原数组排列成的顺序排列。

解题思路

求出每个数环的长度,结果则为环的长度的最小公倍数。结果用python表示,C++用不好会炸。

def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a % b)

def lcm(a, b):
    return (a//gcd(a, b)*b) % (10**n)

vis = [0]*200005
n = int(input())
num = [int(n) for n in input().split()]
cir = []
ans = 1
for j in num:
    if(vis[j] != 0):
        continue
    cir.clear()
    while(vis[j] == 0):
        vis[j] = 1
        cir.append(j)
        j = num[j-1]
    ans = lcm(ans, len(cir))
print(ans)

D. Drop Voicing

题意

有两种操作:
Drop-2: 把右数第二个数移至最左边。
Invert:环形旋转整个序列一位。
每一步可以进行单个操作任意次,求至少多少次后可以将原数组排列成的顺序排列。

解题思路

网上有个题解思路写得很清楚。

花费1即连续的①相当于可以把倒数第二个往前移任意个位置。那么我们可以花费1经连续的①把倒数第二个往前的若干个数移到最前面,然后花费0经②把该的若干个数又移到最后面,所以可以等价于花费1可以把最后一个数移到前面任意两个数之间。

既然可以旋转任意多次,那么,多次Drop-2等价于将一个元素移至任意位置,多次Invert等价于旋转序列任意位。所以这道题即是求整个环形序列的最大上升子序列长度,结果就是n-ans。

// rotate函数用法
rotate(数组首地址, 旋转后数组首地址, 数组末地址);
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;

int dp[maxn], a[maxn];
int ans, n;

int fun(int n) {
    for(int i=0;i<=n;i++) dp[i]=1;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<i;j++) {
            if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1); 
        }
    }
    return dp[n];
} 

int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) {
        ans = max(ans, fun(n));
        rotate(a+1,a+2,a+n+1);
    }
    printf("%d\n", n-ans);
}
全部评论
I题脑子转不过来
点赞 回复 分享
发布于 2020-08-01 18:41

相关推荐

点赞 评论 收藏
分享
自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务