【WC2001】【cogs358】高性能计算机(动态规划)
【WC2001】【cogs358】高性能计算机(动态规划)
##题面
【问题描述】
现在有一项时间紧迫的工程计算任务要交给你——国家高性能并行计算机的主管工程师——来完成。为了尽可能充分发挥并行计算机的优势,我们的计算任务应当划分成若干个小的子任务。
这项大型计算任务包括A和B两个互不相关的较小的计算任务。为了充分发挥并行计算机的运算能力,这些任务需要进行分解。研究发现,A和B都可以各自划分成很多较小的子任务,所有的A类子任务的工作量都是一样的,所有的B类子任务也是如此(A和B类的子任务的工作量不一定相同)。A和B两个计算任务之间,以及各子任务之间都没有执行顺序上的要求。
这台超级计算机拥有p个计算节点,每个节点都包括一个串行处理器、本地主存和高速cache。然而由于常年使用和不连贯的升级,各个计算节点的计算能力并不对称。一个节点的计算能力包括如下几个方面:
就本任务来说,每个节点都有三种工作状态:待机、A类和B类。其中,A类状态下执行A类任务;B类状态下执行B类任务;待机状态下不执行计算。所有的处理器在开始工作之前都处于待机状态,而从其它的状态转入A或B的工作状态(包括A和B之间相互转换),都要花费一定的启动时间。对于不同的处理节点,这个时间不一定相同。用两个正整数tiA和tiB (i=1,2,...,p)分别表示节点i转入工作状态A和工作状态B的启动时间(单位:ns)。
一个节点在连续处理同一类任务的时候,执行时间——不含状态转换的时间——随任务量(这一类子任务的数目)的平方增长,即:
若节点i连续处理x个A类子任务,则对应的执行时间为:t=kiAx2
类似的,若节点i连续处理x个B类子任务,对应的执行时间为:t=kiBx2
其中,kiA和kiB是系数,单位是ns,i=1,2,...,p。
任务分配必须在所有计算开始之前完成,所谓任务分配,即给每个计算节点设置一个任务队列,队列由一串A类和B类子任务组成。两类子任务可以交错排列。
计算开始后,各计算节点分别从各自的子任务队列中顺序读取计算任务并执行,队列中连续的同类子任务将由该计算节点一次性读出,队列中一串连续的同类子任务不能被分成两部分执行。
【编程任务】
现在需要你编写程序,给这 p 个节点安排计算任务,使得这个工程计算任务能够尽早完成。假定任务安排好后不再变动,而且所有的节点都同时开始运行,任务安排的目标是使最后结束计算的节点的完成时间尽可能早。
【输入输出】
输入文件名是 hpc.in 。
文件的第一行是对计算任务的描述,包括两个正整数 nA 和 nB,分别是 A 类和 B 类子任务的数目,两个整数之间由一个空格隔开。
文件的后面部分是对此计算机的描述:
文件第二行是一个整数 p ,即计算节点的数目。
随后连续的 p 行按顺序分别描述各个节点的信息,第 i 个节点由第 i+2 行描述,该行包括下述四个正整数(相邻两个整数之间有一个空格):
tiA tiB kiA kiB
输出文件名是 hpc.out 。其中只有一行,包含有一个正整数,即从各节点开始计算到任务完成所用的时间。
【样例】
设输入文件hpc.in为
5 5
3
15 10 6 4
70 100 7 2
30 70 1 6
对应的输出文件 hpc.out 为
93
【数据说明】
1 ≤ nA ≤ 60
1 ≤ nB ≤ 60
1 ≤ p ≤ 20
1 ≤ tA ≤ 1000
1 ≤ tB ≤ 1000
1 ≤ kA ≤ 50
1 ≤ kB ≤ 50
题解
这题不是很难吧。。。
首先考虑做一次DP
预处理出对于每一个节点执行\(i\)个A任务,\(j\)个B任务的最短时间
然后就是一个很简单的DP了
也就是做两次DP
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int f1[25][65][65];
int f2[25][65][65];
int p,ta[25],tb[25],ka[25],kb[25];
int na,nb;
//f1[p][i][j]表示第p个节点执行i个A任务,j个B任务的最短时间
void DP1()
{
for(int a=1;a<=p;++a)
{
int F[2][65][65];
memset(F,31,sizeof(F));
F[1][0][0]=F[0][0][0]=0;
for(int i=0;i<=na;++i)
for(int j=0;j<=nb;++j)
{
for(int k=1;k<=i;++k)F[0][i][j]=min(F[0][i][j],F[1][i-k][j]+ka[a]*k*k+ta[a]);
for(int k=1;k<=j;++k)F[1][i][j]=min(F[1][i][j],F[0][i][j-k]+kb[a]*k*k+tb[a]);
f1[a][i][j]=min(F[0][i][j],F[1][i][j]);
}
}
}
//f2[p][i][j]表示前p个节点执行i个A任务,j个B任务的最短时间
void DP2()
{
memset(f2,31,sizeof(f2));
for(int i=0;i<=na;++i)
for(int j=0;j<=nb;++j)
f2[1][i][j]=f1[1][i][j];
for(int a=2;a<=p;++a)
{
for(int i=0;i<=na;++i)
for(int j=0;j<=nb;++j)
for(int k=0;k<=i;++k)
for(int l=0;l<=j;++l)
f2[a][i][j]=min(f2[a][i][j],max(f2[a-1][k][l],f1[a][i-k][j-l]));
}
}
int main()
{
freopen("hpc.in","r",stdin);
freopen("hpc.out","w",stdout);
na=read();nb=read();
p=read();
for(int i=1;i<=p;++i)ta[i]=read(),tb[i]=read(),ka[i]=read(),kb[i]=read();
DP1();
DP2();
printf("%d\n",f2[p][na][nb]);
return 0;
}
【WC2001】【cogs358】高性能计算机(动态规划)的更多相关文章
- 高性能计算机传奇(vamei)
高性能计算机是用网络将多台计算机连接在一起.并构成一个统一的系统,从而拥有远超个人电脑的计算能力.这样利用网络,让计算机合作工作的并行系统又称为集群(cluster).server.分布式计算机.超级 ...
- WC2001 高性能计算机
cogs网址 这道题DP 设g[0/1][i][a][b]表示第i个机子做了a个A,b个B,0/1表示当前为A/B的最小代价 N^4转移 设f[i][a][b]表示前i个机子做了a个A,b个B的最小答 ...
- 【Vijos1534】高性能计算机(DP)
题意:有NA个A与NB个B两种任务需要完成,完成一段长度为X的A任务需要时间ta+ka*x*x,B任务类似,连续的同一种任务不能分成两段运行 有P台可以并行运算的计算机,求最快完成所有任务的时间 1≤ ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- 前端学HTTP之网络基础
× 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...
- 门外汉的IT
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机很早就走入了我的生活.小学时,家里放一台联想“天琴”的电脑.它霸气的音箱造型 ...
- 天河2号荣膺第41届TOP500榜首
国际TOP500组织在6月17日公布最新全球超级计算机500强榜单,由中国国防科技大学研制的“天河二号”以每秒33.86千万亿次的浮点运算速度成为全球最快的超级计算机. 天河2号(又称银河2号),将在 ...
- 基于socket的TCP和UDP编程
一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...
随机推荐
- arm-点亮led灯
点亮指路灯:学习四环节:led原理图分析,芯片手册导读,思维导图设计,为什么要使用led:通常led是作为程序调试的重要手段.led原理图:led实质为发光二极管,当其两端电压一定时,即处于导通状态. ...
- 借助Maven入手Spring Boot第一个程序
目前网上有不少Spring Boot的入门文章,都很有帮助,本人最近在深入学习Spring Cloud,在搭建第一个Hello World程序时,感觉对于新手而言,介绍文章怎么详细都不为过,因为其中坑 ...
- 谷歌内核浏览器 iframe内容的 tab切换 滚动条消失
问题: 新版本的-webkit- 内核浏览器 在tab切换时,iframe 内容区 丢失滚动条 如下图 (虽然滚动条位置还在,可以垂直滚动,但滚动条不见了) 解决思路: 让iframe重新计算宽高,重 ...
- kubernetes 集群的安装部署
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 首先kubernetes得官方文档我自己看着很乱,信息很少, ...
- elasticsearch2.3.3集群搭建踩到的坑
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 作者原来搭建的环境是0.95版本 现在升级到2.3.3版本, ...
- typeahead + JDK 8 并行流 + redis 高速即时查询.
感谢JDK8,让我们JAVA 程序员暂时不用担心失业. 有些情况,需要根据用户输入值,即时查询数据库,MYSQL显然不再适合这种业务. mongoDB看似最适合,但是为了这么一个破功能,也不值得特意去 ...
- spring 配置文件无法加载,junit找不到xml配置文件java.lang.IllegalStateException: Failed to load ApplicationContext
最近遇到一个奇怪的问题.maven项目再进行junit单元测试的时候发现无法加载配置文件.一会能加载一会又不能加载.然后试了在src/main/resource下面的配置文件放到src/test/re ...
- MFC使用SQLite 学习系列 二:无法容忍的数据插入效率
上一篇随笔中,介绍了,基本的使用没什么问题了,那么开始数据的插入. 一 问题--无法容忍的插入效率 代码写入基本完成,然后开始测试.起初,插入数据的时候基本上是插入每次插入9组数据,看不出来数据插入的 ...
- Luogu P1747 好奇怪的游戏
题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被 ...
- 源码编译安装Apache-附一键部署脚本
1.进入apache官网https://www.apache.org/,点击Download 2.如图选择 3.选择httpd 4.下载两个包,2.2为CentOS6使用,2.4为CentOS7使用 ...