Day4 备战CCF-CSP练习

news/2024/10/11 10:20:05

题目描述

有若干个任务需要在一台机器上运行。

它们之间没有依赖关系,因此可以被按照任意顺序执行。

该机器有两个 CPU 和一个 GPU

对于每个任务,你可以为它分配不同的硬件资源:

在单个 CPU 上运行。
在两个 CPU 上同时运行。
在单个 CPUGPU 上同时运行。
在两个 CPUGPU 上同时运行。
一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中断,直到执行结束为止。

\(i\) 个任务用单个 CPU,两个 CPU,单个 CPUGPU,两个 CPUGPU 运行所消耗的时间分别为 \(a_i,b_i,c_i\)\(d_i\)

现在需要你计算出至少需要花多少时间可以把所有给定的任务完成。

输入格式

输入的第一行只有一个正整数 \(n\),是总共需要执行的任务个数。

接下来的 \(n\) 行每行有四个正整数 \(a_i,b_i,c_i,d_i\),以空格隔开。

输出格式

输出只有一个整数,即完成给定的所有任务所需的最少时间。

数据范围

\(1≤n≤40,1≤a_i,b_i,c_i,d_i≤10\)

输入样例:

3
4 4 2 2
7 4 7 4
3 3 3 3

输出样例:

7

样例解释

有很多种调度方案可以在 \(7\) 个时间单位里完成给定的三个任务,以下是其中的一种方案:

同时运行第一个任务(单 CPU 加上 GPU)和第三个任务(单 CPU),它们分别在时刻 \(2\) 和时刻 \(3\) 完成。

在时刻 \(3\) 开始双 CPU 运行任务 \(2\),在时刻 \(7\) 完成。

题目分析

\(dp\)
思路尚不正确,有待优化
\(dp(i , j , k)\) 表示CPU1时间为\(i\)CPU2时间为\(j\)GPU时间为\(k\)的完成任务个数

C++代码

60分

#include <bits/stdc++.h>using namespace std;const int N = 50 , M = 220;int n , m;
int a[N] , b[N] , c[N] , d[N];
int dp[M][M][M];int main()
{cin >> n;int m1 = 0 , m2 = 0;for(int i = 1 ; i <= n; i ++){cin >> a[i] >> b[i] >> c[i] >> d[i];if(i % 2) m2 += a[i];else m1 += a[i];}m = max(m1 , m2);for(int i = 1 ; i <= n ; i ++)for(int j = m ; j >= 0 ; j --)for(int k = m ; k >= 0 ; k --)for(int l = m ; l >= max(j , k) ; l --){// CPU1if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);// CPU2if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);// CPU1 + CPU2if(j >= b[i] && k >= b[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - b[i]][k - b[i]][l] + 1);// CPU1 + GPUif(j >= c[i] && l >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - c[i]][k][l - c[i]] + 1);// CPU2 + GPUif(k >= c[i] && l >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - c[i]][l - c[i]] + 1);// CPU1 + CPU2 + GPUif(k >= d[i] && l >= d[i] && j >= d[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - d[i]][k - d[i]][l - d[i]] + 1);}int res = m;for(int j = 0 ; j <= m ; j ++)for(int k = 0 ; k <= m ; k ++)for(int l = 0 ; l <= m ; l ++)if(dp[j][k][l] == n)res = min(res , max(j , max(k , l)));cout << res << '\n';return 0;
}

50分

#include <bits/stdc++.h>using namespace std;const int N = 50 , M = 210;int n , m;
int a[N] , b[N] , c[N] , d[N];
int dp[M][M][M];int main()
{cin >> n;for(int i = 1 ; i <= n; i ++){cin >> a[i] >> b[i] >> c[i] >> d[i];m += a[i];}m /= 2;for(int i = 1 ; i <= n ; i ++)for(int j = m ; j >= 0 ; j --)for(int k = m ; k >= 0 ; k --)for(int l = max(j , k) ; l >= 0 ; l --){// CPU1if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);// CPU2if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);// CPU1 + CPU2if(j == k && j >= b[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - b[i]][k - b[i]][l] + 1);// CPU1 + GPUif(j == l && j >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - c[i]][k][l - c[i]] + 1);// CPU2 + GPUif(k == l && k >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - c[i]][l - c[i]] + 1);// CPU1 + CPU2 + GPUif(k == l && j == k && k >= d[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - d[i]][k - d[i]][l - d[i]] + 1);}int res = m;for(int j = 0 ; j <= m ; j ++)for(int k = 0 ; k <= m ; k ++)for(int l = 0 ; l <= m ; l ++)if(dp[j][k][l] == n)res = min(res , max(j , max(k , l)));cout << res << '\n';return 0;
}

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

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

相关文章

Linux安装Jenkins指南

Linux安装Jenkins指南 Jenkins,作为一款开源的自动化服务器,广泛用于持续集成和持续部署(CI/CD)流程中。它提供了强大的插件生态系统,使得集成各种开发工具、版本控制系统和构建工具变得简单高效。本文将详细介绍如何在Linux系统上安装和配置Jenkins。 一、准备工作机器要…

设计方案:FMC303-两路5.6Gsps 14bit DA FMC子卡

一、板卡概述FMC303可实现宽波段、双通道、14位、5.6GSPS(2.8gsps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供的采样时钟。此外还为用户提供定制采样控制的触发器输入。FMC303在机械上和电气上符合FMC标准(ANSI/VITA 57.1)。该卡具有多…

kafka基础学习

Kafka 系列的阶段性总结(万字长文,做好准备)这是 Java 极客技术的第 265 篇原创文章 初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎…

降低数据平台成本 ,Apache Airflow迁移上云案例分享

本文介绍了X集团将开源工作流平台Airflow迁移上华为云的案例,重点展示了开源专业服务中的云服务集成适配服务以及能力定制化服务,为此类型企业提供了一个可参考的范例。本文分享自华为云社区《华为云DTSE团队通过开源专业服务,助力马来西亚X集团平滑迁移上云》,作者:华为云…

maven-jar包管理

覆盖更新导致的问题 背景 快速接入sentinel-starter的包。团队80多个服务已经接入<dependency><artifactId>yxt-sentinel-spring-boot-starter</artifactId><groupId>com.yxt</groupId><version>1.0.0</version></dependency>…

[编程笔记] 未能加载文件或程序集“...”或它的某一个依赖项。试图加载格式不正确的程序

未能加载文件或程序集“...”或它的某一个依赖项。试图加载格式不正确的程序使用IIS部署站点,指向代码根目录,启动时报“未能加载文件或程序集“...”或它的某一个依赖项。试图加载格式不正确的程序。”     直接启动项目是可以的,解决上述错误很简单,看下项目属性:  …

高效使用AI,一文掌握提示词的编写原则

ChatGPT问世以后就引爆全网热议,它除了能够聊天,还可以根据所提出的要求进行文字翻译、文案撰写、代码撰写等工作。ChatGPT问世以后就引爆全网热议,它除了能够聊天,还可以根据所提出的要求进行文字翻译、文案撰写、代码撰写等工作。在《探秘爆火的ChatGPT:大语言模型是个啥…

mathtype中嵌入数学公式导致行距变大的解决方法

原因是绝大多数情况下使用的是单倍行距,插入公式后撑大了,可以将字体大小换算成行距,然后改成固定值, 1、但是,有些毕业论文可能会 对齐到网格,那固定的值就不是行距大小,而是网格大小,来这儿看看你的网格是多大。 2、创建的新样式,后续用,修改字体位置:标准 3、修改…