右端点对齐|镜像复用

lc1648

lc2271

排序瓷砖区间后用滑动窗口,以每个区间右端点为地毯右端,计算窗口内覆盖的最大长度

class Solution {

typedef long long ll;

public:

int maximumWhiteTiles(vector<vector<int>>& tiles, int carpetLen)

{

ll a = 0, s = 0;

int i = 0, l = carpetLen;

sort(tiles.begin(), tiles.end());

for (auto& v : tiles)

{

int L = v0, R = v1;

s += (ll)(R - L + 1);

++int cl = R - l + 1;++

while (i < tiles.size() && tilesi1 < cl)

{

s -= (ll)(tilesi1 - tilesi0 + 1);

i++;

}

ll u = 0;

if (i < tiles.size() && tilesi0 < cl)

++u = (ll)(cl - tilesi0);++

a = max(a, s - u);

}

return a;

}

};

本质上是窗口内一块一块加毯子,什么情况下缩短窗口呢,毯子盖不到左边毯子的右侧就缩短,开始扯毯子,窗口的大小是多少呢

(我现在已经把整块左侧项的长度都算进来了,而毯子可能只盖到了左侧项的一部分 那么就要减去之前多加进来的长度)

lc3413

镜像翻转 复用代码

先排序硬币区间,用++滑动窗口算正向最大硬币数++

再反转并转换区间方向二次计算,最终取两次结果的最大值。

#include <vector>

#include <algorithm>

using namespace std;

class Solution {

using ll = long long;

ll f(vector<vector<int>>& t, int l) {

ll a = 0, s = 0;

int i = 0;

for (auto& v : t) {

int L = v0, R = v1, c = v2;

s += (ll)(R - L + 1) * c;

int cl = R - l + 1;

while (ti1 < cl) {//find ok_l

s -= (ll)(ti1 - ti0 + 1) * ti2;

i++;

}

ll u = max((ll)(cl - ti0) * ti2, 0LL);

a = max(a, s - u);

}

return a;

}

public:

ll maximumCoins(vector<vector<int>>& c, int k) {

sort(c.begin(), c.end());

ll a = f(c, k);

reverse(c.begin(), c.end());

for (auto& v : c) {

int tmp = v0;

v0 = -v1;

v1 = -tmp;

}

return ++max(a, f(c, k));++

}

};

相关推荐
致Great18 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
罗西的思考1 天前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机1 天前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil2081 天前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返1 天前
算法系列2:滑动窗口
算法
Herbert_hwt1 天前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
Tisfy1 天前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-1 天前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。1 天前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真1 天前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法