首页 > 其他分享 >Day4 备战CCF-CSP练习

Day4 备战CCF-CSP练习

时间:2024-10-11 10:12:41浏览次数:6  
标签:int max Day4 CPU && GPU CCF CSP dp

题目描述

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

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

该机器有两个 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 --)
                {
                    // CPU1
                    if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);
                    // CPU2
                    if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);
                    // CPU1 + CPU2
                    if(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 + GPU
                    if(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 + GPU
                    if(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 + GPU
                    if(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 --)
                {
                    // CPU1
                    if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);
                    // CPU2
                    if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);
                    // CPU1 + CPU2
                    if(j == k && j >= b[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - b[i]][k - b[i]][l] + 1);
                    // CPU1 + GPU
                    if(j == l && j >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - c[i]][k][l - c[i]] + 1);
                    // CPU2 + GPU
                    if(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 + GPU
                    if(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;
}

标签:int,max,Day4,CPU,&&,GPU,CCF,CSP,dp
From: https://www.cnblogs.com/mathblog/p/18457871

相关文章

  • day4-2
    前天学习了在c++中怎么使用单链表,我在网上学习了在Java中如何实现:定义节点类:classNode{intdata;//存储数据Nodenext;//指向下一个节点的引用//构造函数publicNode(intdata){this.data=data;this.next=null;}}定义链表类:classSinglyLinkedLi......
  • CSP 模拟 44
    A02表示法简洁高精度B子串的子串做法一:数颜色,考虑经典套路,记\(pre\),然后成了三维数点问题,CDQ,跟暴力同分。做法二:还是三维数点,但是能\(n^2\)的题为啥要上高级东西,暴力固定住右端点,暴力检查左端点,然后对于每个串能贡献的是pre到左端点的一段合法区间,然后成了区间的并,再暴......
  • 2024CSP-J模拟赛————S12678
    禁止抄袭!!!一,赛中得分硬币(coin)100数位(digit)100划分(partition)0路径(path)0总分200二,赛中概括第一第二题30分钟做完,三四题不会。三,题目解析硬币(coin)1.1问题描述小明很喜欢 100这个数字,父母给他一些零花钱,这些零花钱的面值是 a 和 b,即小明......
  • CSP 模拟 43
    A欧几里得的噩梦每一个数最多只有两个\(1\),模拟线性基的插入过程,发现插入是一条链,没有之后连向\(0\)结束,拿并查集维护这条链,对于单个\(1\),直接插入即可,两个\(1\)的检查两个\(1\)最后的位置是否一样,如果一样就不能插入,否则大到小连边。B清扫对于一个不为叶子的节点,清......
  • CSP 模拟 42
    A五彩斑斓枚举上面两个顶点同色,同列的同色,拿桶记一下就行。赛时直接给颜色分了个块,逐个块处理的。B错峰旅行方案数直接乘起来即可,离散化后差分扫描线。C线段树观察到性质:一个查询的区间个数为\(1\)加上分裂次数,当它和一个区间有交但并不包含时,就会分裂一次。设\(f_{i,......
  • 2024.9.30 CSP
    模拟赛赛后看着分哗啦啦的往下掉。T1median找中位数,赛时假做法A了,没想到直接搜。。。code#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5,mod=998244353;intn;inta[6][N],ans,f[6][4];unordered_map<int,bool>mp;intdfs(intp,intl,int......
  • 2024.9.28 模拟赛 CSP6
    模拟赛单\(log\)双\(log\)不如三\(log\)。T1一般图最小匹配简单dp,水。\(O(n^2)\)其实也是可反悔贪心的板子,可以\(O(n\log(n))\)做。考虑排序后求差分数组,就变成不能选相邻的。然后就是可反悔贪心板子。用双向链表(记录前驱后继)维护,然后放进堆里。板dp#include<b......
  • [赛记] csp-s模拟10
    欧几里得的噩梦-pts看见是个线性基的题就没打;其实也不是线性基,只不过模拟了一下它的过程;考虑插入一位数时它能不能被表示,其实就是它异或上线性基中的某些值后可不可以为$0$,那么我们就可以将插入的单独一位数与$0$连边,将两位数互相连边,这样每插入一位数时看看它与$0$......
  • Day3 备战CCF-CSP练习
    Day3题目描述目前在一个很大的平面房间里有\(n\)个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过\(r\)就能互相建立网络连接。除此以外,另有\(m\)个可以摆放无线路由器的位置。你可以在这些位置中选择至多\(k\)个增设新的路由器。你的......
  • [赛记] csp-s模拟8 && csp-s模拟9
    HZOI大作战15pts赛时暴力跳父亲15pts;正解:发现在树上对于向上找大于这个数的操作具有随意划分性,所以考虑倍增,设$f_{i,j}$表示从$i$这个点向上跳$2^j$个比它大的数能跳到哪里,于是我们只需处理出向上跳一个(也就是$f_{i,0}$)的,然后$ST$表预处理即可;具体地,对于......