第10届集美大学校赛(F,H)

news2024/12/24 17:25:33

两个有些难度的dp

中文题面,题意略

F 时间超限 II

一开始的思路想复杂了,想成了多重集的组合数学,二进制枚举肯定不行,dp也想的很复杂还错估时间复杂度。

补题的时候被题解的方法折磨好久,太抽象了。
这是官方题解
官方题解
曾一度质疑是不是有问题 (官方的题解肯定没问题,是自己太笨看不懂),dp方程定义看起来是方案数又涉及时间,前面的时间乘上后,后面转移又用的加法,认为没有考虑到后面方案数也要乘上。但是用一份过了代码跑了一下后发现题解的dp算出来根本没错,但还是理解不了,果然还是自己太菜了(悲)。

这里介绍一种我自己的比较好理解的思路。

思路

我们考虑将方案数和时间分开考虑,枚举评测机 i i i 和该评测机上测评了 j j j 份代码,并且小M的代码也在其中,这样时间就确定了是 t i j t_{ij} tij,只需要求出现这一情况的方案数即可。

如何求方案数?考虑到前 1 ∼ i − 1 1\sim i-1 1i1 个评测机上有不同情况,后 i + 1 ∼ n i + 1\sim n i+1n 个评测机上也有不同情况,两者相乘才是总的方案数,于是我们就对前后缀分别求一次dp,dp方程定义是:

后缀 g [ i ] [ j ] g[i][j] g[i][j]:从后开始到 i i i 为止的评测机共测评了 j j j 份代码,并且小M的代码不在其中的方案数。

g[n + 1][0] = 1;
for(int i = n; i >= 1; i --){
    int suf = min(m, pre[n] - pre[i - 1]); // 最大评测题数
    for(int j = 0; j <= suf; j ++){ // 枚举题数
		for(int p = 0; p <= min(k[i], j); p ++){ // 枚举这个评测机上的题数
			g[i][j] = (g[i][j] + g[i + 1][j - p]) % mod;
		}
    }
}

前缀 f [ i ] [ j ] f[i][j] f[i][j]:前 i i i 个评测机共评测了 j j j 份代码,并且小M的代码在其中的总方案数。
在求前缀的代码中就可以边求方案数,边把答案算进总答案了,转移和后缀其实一模一样,直接看总代码就好了。

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 2e3 + 10, M = 1e4 + 10, mod = 1e9 + 7;

vector<int> v[N];
int n, m;
int k[N], pre[N];


ll f[N][M]; // 前i台评测机,总共评测了j个题目,指定代码评测了的方案数
ll g[N][M]; // 从后往前直到第i台评测机,总共评测了j个题目,指定代码没有评测的方案数
ll sum[M][2]; 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> k[i];
        pre[i] = pre[i - 1] + k[i];
        for(int j = 1, t; j <= k[i]; j ++){
            cin >> t;
            v[i].push_back(t);
        }
    }

    cin >> m;
	g[n + 1][0] = 1;
    for(int i = n; i >= 1; i --){
        int suf = min(m, pre[n] - pre[i - 1]); // 后缀最大评测题数
        for(int j = 0; j <= suf; j ++){ // 枚举题数
			for(int p = 0; p <= min(k[i], j); p ++){ // 枚举这个评测机上的题数
				g[i][j] = (g[i][j] + g[i + 1][j - p]) % mod;
			}
        }
    }

    ll ans = 0;
    f[0][0] = 1;
    for(int i = 1; i <= n; i ++){
        int p = min(m, pre[i]); // 前缀最大评测数
        for(int j = 0; j <= p; j ++){ // 枚举题数
        	for(int q = 0; q <= min(k[i], j); q ++){ // 枚举这个评测机评测的代码
                f[i][j] = (f[i][j] + f[i - 1][j - q]) % mod;
				// 总时间 = 前缀方案数 * 后缀方案数 * 时间
                if(q) ans = (ans + f[i - 1][j - q] * g[i + 1][m - j] % mod * v[i][q - 1] % mod) % mod;   
            }
        }
    }  
    
    cout << ans << "\n";
    
    return 0;
}

待补

H 玻璃球

思路

代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tbh着色

在tbh中&#xff0c;着色之前&#xff0c;首先可以可以创建多个色板&#xff0c;如果不同角色颜色不一样&#xff0c;就可以创建多个色板&#xff0c;每一个色板代表的角色不同。 1、创建色板 有两种方式&#xff1a; 方法一&#xff1a;在颜色菜单中&#xff0c;点击左上角 …

2023年【山东省安全员C证】考试内容及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试内容是安全生产模拟考试一点通总题库中生成的一套山东省安全员C证复审考试&#xff0c;安全生产模拟考试一点通上山东省安全员C证作业手机同步练习。2023年【山东省安全员C证】考试内容及山东省安…

『精』Vue 组件如何模块化抽离Props

『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料&#x1f498;推荐博文&#x1f357; 一、为什么要抽…

串口代码整合2-如何接收数据?

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

力扣刷题-二叉树-二叉树的非递归遍历

参考&#xff1a;https://www.programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF 思路 为什么可以用迭代法&#xff08;非递归的方式&#xff09;来实现二叉树的前后中序遍历呢&#xff1f; 我们在栈与…

ruo-yi项目部署 前后端分离

nginx服务器部署java服务器部署db服务器部署配置打包环境配置前端打包环境&#xff08;java服务器&#xff09;配置后端打包环境获取代码 前端代码打包后端代码打包项目上线前端项目上线后端项目上线 将jar包传送到后端服务器导入初始化数据 ip主机名服务名称192.168.20.138ngi…

BEV-YOLO 论文学习

1. 解决了什么问题&#xff1f; 出于安全和导航的目的&#xff0c;自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个&#xff1a;第一种传感器融合方案整合激光雷达、相机和毫米波雷达&#xff0c;和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…

【Linux】:重定向和用户缓冲区

重定向和用户缓冲区 一.输出重定向1.现象2.系统调用接口 二.缓冲区1.引子2.刷新 三.回答引例 文件描述符对应匹配规则&#xff1a;从0下标开始&#xff0c;寻找最小的没有被使用的数组位置&#xff0c;它就是新的文件描述符(fd)。 一.输出重定向 1.现象 在这里我们向1号文件内…

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…

YOLOv8在前代的基础上有哪些改进?

YOLO系列又双叒更新&#xff01; 只能说&#xff0c;YOLO系列发展地真快&#xff0c;已经有点跟不上了&#xff01; YOLOv1-YOLOv8系列回顾 YOLOv1&#xff1a;2015年Joseph Redmon和Ali Farhadi等人&#xff08;华盛顿大学&#xff09; YOLOv2&#xff1a;2016年Joseph Re…

使用seldom编写http接口用例

在编写接口用例的过程中&#xff0c;针对一个接口&#xff0c;往往只是参数不同&#xff0c;那么参数化就非常有必要了。 seldom 中参数化的用法非常灵活&#xff0c;这里仅介绍file_data() 的N种玩法。 二维列表 当参数比较简单时可以试试下面的方式。 参数化数据 {"…

qt6-QPushButton无法显示为类

问题 在编写QT程序时&#xff0c;不同颜色表示不同的含义。在设计基本的界面&#xff0c;需要使用QRadioButton时&#xff0c;相应的字符为紫色&#xff0c;紫色为类名。这篇简单说明了下&#xff0c;也可以鼠标点击页面&#xff0c;可以出现提示。 但是上面图片中显示&#…

linux中if条件判断,case...esac,function学习

第一、 if [ 判断式 ] ; then fi 注意&#xff1a;中括号和判断式之间的空格&#xff0c;否则会报错&#xff0c;上案例 第二个图的12行&#xff0c;中括号和条件判断如果没有空格&#xff0c;则会提示缺号‘】’&#xff0c;如第二个图最上面的提示。所以使用中括号的格式…

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

目录 一、前言 二、static关键字是什么&#xff1f; 三、static关键字修饰的对象是什么&#xff1f; 四、C 语言中的 static &#x1f34e;static的C用法 &#x1f349;static的重点概念 &#x1f350;static修饰局部变量 &#x1f4a6;static在修饰局部变量和函数的作用 &a…

office2024下载详细安装教程

简单的说 Office 是一款由Microsoft 开发的一套办公软件&#xff0c;里面包含了常用的办公组件而其中就包含了Word、Excel、PowerPoint、Access等&#xff01; 并且office是目前最常用的一类办公软件&#xff0c;使用它可以解决日常生活和工作中遇到的很多问题。 熟练掌握offi…

FMC+DAM驱动LVGL刷屏

前提条件 使用FMC驱动LCD刷屏 LVGL移植 开启DMA 需要开启MEMTOMEMDMA。 开启MPU 有MPU时需要 使能I-cache D-cache时 使用DMA传输数据时要保证数据的完整行和准确性 修改代码 逻辑 等待DMA传输完成然后再刷屏。 修改 在DMA初始化函数中最后添加 注册DMA传输完成调用函…

《动态顺序表》的实现

目录 前言&#xff1a; 认识线性表&#xff1a; 关于顺序表 实现动态顺序表&#xff1a; 顺序表的动态存储定义&#xff1a; 初始化顺序表&#xff1a; 顺序表的销毁&#xff1a; 尾插&#xff1a; 判断是否需要扩容&#xff1a; 总代码&#xff1a; 头插&#xff1a…

树莓派结合Nginx,轻松搭建内网穿透服务实现远程访问内部站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

C++17中std::any的使用

类sdk:any提供类型安全的容器来存储任何类型的单个值。通俗地说&#xff0c;std::any是一个容器&#xff0c;可以在其中存储任何值(或用户数据)&#xff0c;而无需担心类型安全。void*的功能有限&#xff0c;仅存储指针类型&#xff0c;被视为不安全模式。std::any可以被视为vo…

C语言实现输出一行文字中最长单词

完整代码&#xff1a; // 输出一行文字中最长单词 #include<stdio.h>#define N 20int main(){char str[N];printf("请输入一行文字\n");gets(str);//最长字符串的长度int max0;//str数组的下标int i0;//记录最长字符串在数组中的位置int flag0;//记录每个单词…