20240520刷题总结

news/2024/11/15 1:07:01/文章来源:https://www.cnblogs.com/qinyiting/p/18202416

T1(状态置换,搜索与dp, dp存值结构体)

T376。
还是从搜索角度去考虑:时间,前i物品,最多拿多少。
这样我们去设计状态,我一开始设置:时间,前i,值是拿多少。会发现这样会爆。
其实换一下,优化效果更好。前i物品,最多拿j,用的最少时间。
实际转移就是背包。存值就存结构体。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N = 2010, INF = 0x3f3f3f3f;struct Node
{int day, tim;bool operator< (const Node& W) const{if (day != W.day) return day < W.day;return tim < W.tim;}
}f[N];
int n, t, m;Node add(Node a, int b)
{if (b > t) return {INF, INF}; //一天都放不下Node c = {a.day, a.tim + b};if (c.tim > t) c.day ++ , c.tim = b;return c;
}int main()
{scanf("%d%d%d", &n, &t, &m);for (int i = 1; i <= n; i ++ ) f[i] = {INF, INF};f[0] = {1, 0}; //第1天for (int i = 1; i <= n; i ++ ){int v;scanf("%d", &v);for (int j = i; j; j -- ){f[j] = min(f[j], add(f[j - 1], v));}}for (int i = n; i; i -- ){if (f[i].tim <= t && f[i].day <= m){printf("%d\n", i);return 0;}}puts("0");return 0;
}

T2(数学题)

s->t, 首先构造方案。先往下走,走到不能走乘2,一直加,加到不能加乘,乘完减回来。

唯一有疑问的是乘完往不往下走1。假设乘完往下走,乘二至少剩下1个格。

中间大于等于一,因为最坏情况也是偶数。如果起点为奇数,那么数为2* (n - 1), 减n,是n - 2, 而n是严格>=2的。所以最起码不会更坏。
也就是1 + 1 <= (>=1) + 1
这样就行了。最后跳直接枚举就行了。 k * 2 - n + 1, (k + m) * 2 - n + m。其实也一样。

#include <bits/stdc++.h>
using namespace std;int n, k, ans = 0;int main() {cin >> n >> k;if (n >= k)ans = n-k;else {int i=n, step=0;for (;i<k;) {pif (i * 2 > k)ans = max(ans, step + 1 + i*2-k);i++;if (i % 2 == 0 && i/2 < n)step = max(step+1, n-i/2 + 1);elsestep = step+1;}ans = max(ans, step);}cout << ans;return 0;
}

T3:(回文,重新分类,dp套小dp,两个相互加中间中转)
首先回文问题,从中间或两端走,这里从中间bfs。其实这个好想。

每次扩展相同字母。
其实极端情况能卡爆。就是每个都是a扩展。
这样就过不去了。考虑优化。这里两个相互加,我们可以考虑在中间加一个中转,这样不就行了?如何套呢?先扩展一条边的状态就行了,再扩展。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;const int N = 410, M = 30, K = 60010;int h[N], pre_h[N], e[K << 1], ne[K << 1], w[K << 1], idx;bool flag[N][N];
int f[N][N], g[N][N][M];
int c[N];
struct Node
{int x, y, c;
}q[5000010];
int n, m;void add(int h[], int a, int b, int c)
{e[ ++ idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
}void bfs()
{memset(f, 0x3f, sizeof f);memset(g, 0x3f, sizeof g);int hh = 0, tt = -1;for (int i = 1; i <= n; i ++ ) q[ ++ tt] = {i, i, 0}, f[i][i] = 0;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )if (i != j && flag[i][j]) q[ ++ tt] = {i, j, 0}, f[i][j] = 1;while (hh <= tt){Node t = q[hh ++ ];if (!t.c) //f{for (int i = h[t.y]; i; i = ne[i]){int j = e[i];if (g[t.x][j][w[i]] > f[t.x][t.y] + 1){g[t.x][j][w[i]] = f[t.x][t.y] + 1;q[ ++ tt] = {t.x, j, w[i]};}}}else{for (int i = pre_h[t.x]; i; i = ne[i]){int j = e[i];if (t.c != w[i]) continue;if (f[j][t.y] > g[t.x][t.y][t.c] + 1){f[j][t.y] = g[t.x][t.y][t.c] + 1;q[ ++ tt] = {j, t.y, 0};}}}}
}int main()
{scanf("%d%d", &n, &m);while (m -- ){int a, b;char c;scanf("%d %d %c", &a, &b, &c);flag[a][b] = true; //单向边add(h, a, b, (int)c - 'a' + 1), add(pre_h, b, a, (int)c - 'a' + 1);}bfs();int k;scanf("%d", &k);for (int i = 0; i < k; i ++ ){scanf("%d", &c[i]);if (i){if (f[c[i - 1]][c[i]] < 1e9) printf("%d\n", f[c[i - 1]][c[i]]);else puts("-1");}}return 0;
}

T4(枚举,spfa要快一些)

枚举最短路上边边,跑最短路。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 1010, M = N * N;int h[N], e[M], ne[M], w[M], idx;
int pre[N], prew[N];
bool st[N];
int d[N];
int n, m;
bool flag;
void add(int a, int b, int c)
{e[ ++ idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
}void spfa(int del)
{queue<int> q;flag = false;memset(d, 0x3f, sizeof d);d[1] = 0;q.push(1);while (q.size()){int t = q.front(); q.pop();st[t] = false;for (int i = h[t]; i; i = ne[i]){int j = e[i];if (i == del) continue;if (d[j] > d[t] + w[i]){pre[j] = t;prew[j] = i;d[j] = d[t] + w[i];if (!st[j]) q.push(j), st[j] = true;}}}
}int main()
{scanf("%d%d", &n, &m);while (m -- ){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c);}spfa(0);int ans = d[n];int k = n, w = prew[n];while (k){spfa(w);w = prew[k];k = pre[k];ans = max(ans, d[n]);}cout << ans << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709866.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP:CX_SY_READ_SRC_LINE_TOO_LONG解决

在ABAP程序编辑器中,确保每行的字符数小于72个,将光标放到行结尾,就能在右下角能看到字符总数。 只要行字符都小于72个,dump就不会再出现了。。。。 还有一种方法就是调整一下abap editor的配置,勾上Downwards-Compatible Line Length(72)。在ABAP编辑器菜单点击“实用程序…

error The system will suspend now!

解决 rambo@test2:~$ sudo mkdir /etc/systemd/sleep.conf.d rambo@test2:~$ sudo vim /etc/systemd/sleep.conf.d/nosuspend.conf [Sleep] AllowSuspend=no AllowHibernation=no AllowSuspendThenHibernate=no AllowHybridSleep=no

Hello-FPGA Camera link Full Receiver FMC Card User Manual

Hello-FPGA info@hello-fpga.cOM Hello-FPGA Camera link Full Receiver FMC Card User Manual目录 Hello-FPGA Camera link Full Receiver FMC Card User Manual 1 Hello-FPGA Camera link Full Receiver FMC Card User Manual 3 1 Camera link 简介 3 2 Camera link FPGA FUL…

[转帖]Redis系列:深刻理解高性能Redis的本质

https://heapdump.cn/monographic/detail/49/5461379 1 背景 分布式系统绕不开的核心之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升。通过使用缓存,我们把频繁查询的数据由磁盘调度到缓存中,保证数据的高效率读写。当然,除了在内存内运行还远远不够,…

[转帖] CPU性能优化基本篇:一定要了解Linux CPU哪些基本概念

laziobird目录 第一篇:CPU性能优化基础篇:一定要了解Linux CPU哪些基本概念 第二篇:CPU 优化高级篇:Linux系统中CPU占用率较高问题排查思路与解决方法第三篇:CPU 优化高级篇:Java CPU 高的原因和排查方法 :如何定位Java 消耗CPU最多的线程第四篇:CPU 优化高级篇:Ja…

异步编程

导入模块:导入asyncio库,这是Python的异步编程库。导入time模块,用于获取当前时间。定义异步函数:say_after是一个异步函数,它接受两个参数:delay(等待的时间)和what(要打印的消息)。函数内部使用await asyncio.sleep(delay)来等待指定的延迟时间。函数返回一个格式化…

OWA top 10 简介

owa top 10 OWASP Top10是什么? OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。 其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结并…

OpenVX便携式、高能效的视觉处理

OpenVX便携式、高能效的视觉处理 OpenVX 1.3.1 来了! OpenVX 1.3.1 规范于 2022 年 2 月 2 日发布OpenVX™ 是一种开放、免版税的标准,用于计算机视觉应用程序的跨平台加速。OpenVX 支持性能和功耗优化的计算机视觉处理,这在嵌入式和实时用例中尤为重要,例如面部、身体和手…

分片集群组件

MongoDB分片集群由以下组件组成:shard:每个分片包含分片数据的子集。每个分片必须部署为副本集。mongos:mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。mongos可以支持 对冲读取以最小化延迟。config servers:配置服务器存储集群的元数据和配置设置。从 …

解决Windows远程桌面连接Windows时“终端服务器超出了最大允许连接数”

解决Windows远程桌面连接Windows时“终端服务器超出了最大允许连接数”1. 问题分析 在Windows Server中,远程桌面服务的默认连接数限制为2个。当用户通过远程桌面登录并直接关闭窗口时,实际上连接并未被释放,而是保持在服务器端,导致连接数累积。当连接数达到最大值时,用户…

06--加密逻辑

各种加密逻辑 在进行js逆向的时候,总会遇见一些人类无法直接能理解的东西出现。此时你看到的大多数,是被加密过的密文。 一. 一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑。其特点就是小巧、速度快、极难被破解(王小云女士) 所以md5,依然是国内非常多的互联网公司,选择…

05--抓包工具、PyExecjs模块

抓包工具、PyExeJs模块 在处理一些网站的时候,会遇到一些屏蔽F12,以及只要按出浏览器的开发者工具,就会关闭甚至死机的现象 在遇到这类网站的时候,可以使用抓包工具,把页面上屏蔽开发者工具的代码给干掉 一. Fiddler和Charles 这两款工具是非常优秀的抓包工具。它们可以监…