首页 > 其他分享 >20240520刷题总结

20240520刷题总结

时间:2024-05-21 09:01:30浏览次数:16  
标签:总结 include int scanf step ans 20240520 day 刷题

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(数学题)

1949。
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;) {p
			if (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);
			else
				step = step+1;
		}
		ans = max(ans, step);
	}
	
	cout << ans;
	
	return 0;
}

T3:(回文,重新分类,dp套小dp,两个相互加中间中转)

2579
首先回文问题,从中间或两端走,这里从中间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要快一些)

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

#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;
}

标签:总结,include,int,scanf,step,ans,20240520,day,刷题
From: https://www.cnblogs.com/qinyiting/p/18202416

相关文章

  • 登录页面漏洞总结
    汇总一些项目中挖到过的,和做项目的时候会用到的测试方法,最近也是疲于面试,讲的是时候总是一时想不起来,所以决定还是总结一下吧,以后我还是要多放网络安全相关的,面试官看时候也知道我了解哪些点,但奈何笔记太多需要整理一下再放出来,以前不敢放是因为确实一直觉得自己太菜了。如果后面......
  • 5_20总结
    tomcat设置①On'Update'action:从字面上理解就是手工触发update动作的时候做什么updateresources ----更新静态的资源,比如html,js,css等运行模式和调试模式都是立即生效。updateclassesandresources ----更新java,jsp和静态资源java修改后,会被编译成.cla......
  • 应用层总结笔记2
    1.HTTP是什么超文本传输协议用于主机之间传输文字、图片、视频等超文本数据的规范协议HTTP不限于服务器向客户端发送超文本,服务器之间也可能进行超文本的传输2.******HTTP的状态码除了不常见的1类提示信息还有2类的报文成功收到状态信息3类的重定向信息,表示客户端申请访问......
  • 网络层总结比较4
    1.网络层的IP协议包含哪些内容(1)IP基础知识:IP作用:实现源主机与目标主机之间的通信,是点对点的通信IP和MAC的关系:IP属于网络层、MAC属于数据链路层,IP可以实现复杂网络里两个主机的通信,MAC只用于具有直接链路连接的两个设备之间的通信(2)IP地址相关知识:IP地址定义:表示每个主机或者......
  • 传输层总结笔记3
    1.TCP头格式有源、目的端口号,指示进行通信的两个应用进程;首部长度;序列号,表示数据部分的第一个字节的编号;确认号,表示希望接收到的下一个字节的编号,表明该编号之前的数据都已经被确认接收了;控制位,ACK表示确认号有效性RST表示强制断开连接SYN、FIN方别表示报文属于TCP连接建立......
  • 力扣刷题备忘1
    1、释放链表节点时要注意,不要出现先保存虚拟头节点,然后又释放的情况,释放后的地址不应该被使用正确写法:ListNode*dhead=newListNode(0,head);//虚拟头结点ListNode*result=dhead->next;//释放dhead之前,使用result保存deletedhead;错误写法:ListNode*result=dhea......
  • C++算法刷题基础
    1.main函数的返回类型一定是int2.C++语言为我们准备了一组内置库,包含了很多常用的功能,并且这些内置库可以直接使用,而其中的内置库:iostream,就提供了输入和输出的功能,允许开发者从键盘读取输入并在屏幕上输出结果。3.在iostream库中,我们有两个对象可以使用,分别是cin和cout。......
  • C++ 异常处理注意事项总结
    C++异常处理注意事项总结:异常安全代码:编写异常安全的代码是至关重要的。这意味着你的代码应该在面对异常时能够正确地清理资源并维持程序状态。使用RAII(ResourceAcquisitionIsInitialization)技术可以帮助自动管理资源,减少内存泄漏的风险。使用noexcept:对于不会抛出异常......
  • C++ 多线程编程要点总结
    C++多线程编程要点总结:选择合适的线程库:C++11引入了 <thread> 头文件,提供了对线程的原生支持。也可以使用第三方库,如Boost.Thread,它提供了更多高级功能和更好的跨平台兼容性。线程创建与管理:使用 std::thread 类创建新线程,并传入函数或可调用对象作为线程的入口......
  • Unity优化总结(2021.04.08)
    项目性能优化的三个方面:1.CPU优化Cpu优化不够会出现的问题:由于短时间计算量太大,画面流畅性降低,出现跳帧发热严重,耗电量高(1)代码方面删除一些空的方法,尤其是Update等;使用for循环代替foreach,使用List代替ArrayList,尽量少使用封箱拆箱操作;循环中可以Break掉的直接退出循......