【9506】最佳调度问题
来源:互联网 发布:nginx 411 编辑:程序博客网 时间:2024/06/01 09:16
Time Limit: 1000ms second
Memory Limit: 32m 问题描述:
假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。对任意给定的整数n和k,以及完成任务i需要的时间ti,i=1~n,试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早
Input
第一行有2个正整数n和k。第二行的n个正整数是完成n个任务需要的时间。
Output
计算出的完成全部任务的最早时间
Sample Input
7 32 14 4 16 6 5 3
Sample Output
17
【题解】
这题和排队打水那题不一样,不能用贪心法来做。同时,这道题的数据也显示,某台机器分配一件工作之后,就必须要把这件工作做完才能换其他工作,不能中途更换。这样的话,我们只有为每一个工作分配一台机器就好。然后他会按顺序一直做完。每台机器上用的时间也就可以知道了。最后看一下哪台机器用的时间最长,那就是这种分配工作的方法所用的时间,枚举一下分配的方法就好,最后获取最小值。
【代码】
#include <cstdio>int n,k,a[20],b[20],min_t = 2100000000;void input_data(){ scanf("%d %d",&n,&k); for (int i = 1; i <= n;i++) scanf("%d",&a[i]); for (int i = 1;i <= k;i++) //一开始所有的机器都没有花费时间 b[i] = 0;}void sear_ch(int x) //为第x件工作分配机器{ if (x == n+1) //如果工作全都分配完了 { int max_t = b[1]; //找到所有机器中花费时间最长的机器,即为这次分配所用的时间 for (int i = 2;i <= k;i++) if (b[i] > max_t) max_t = b[i]; if (max_t < min_t) //如果能够更新最小值 就更新 min_t = max_t; return; //退出这一层递归 } for (int i = 1;i <= k;i++) //枚举k台机器 { if (b[i] + a[x] > min_t) continue;//如果这台机器再加上这件任务会比当前的最小值大就没有必要加了,因为最后会没有办法更新最小值了 b[i] += a[x]; //第i台机器分配第x件任务 sear_ch(x+1); //继续分配下一件任务 b[i] -= a[x]; //回溯 }}void get_ans(){ sear_ch(1);}void output_ans(){ printf("%d\n",min_t);}int main(){ //freopen("F:\\rush.txt","r",stdin); input_data(); get_ans(); output_ans(); return 0;}
0 0
- 【9506】最佳调度问题
- 最佳调度问题
- 最佳调度问题
- 最佳调度问题
- 最佳调度问题
- 最佳调度问题6_8
- 最佳调度问题 解题报告
- 最佳调度问题pascal程序
- 最佳调度问题的回溯算法
- 算法-回溯法解决最佳调度问题
- 搜索与回溯 最佳调度问题
- 回溯法——最佳调度问题
- 最佳调度问题的回溯算法(java实现)
- 《算法导论》实验三:最佳调度问题的回溯算法
- 多机最佳调度
- 11089 多机最佳调度
- kettle调度监控最佳实践
- 开源调度框架Quartz最佳实践
- Android图片异步加载框架Android-Universal-Image-Loader
- 单独的BFS实现
- Lua 在 windows上的环境配置
- webKitView的reload和loadRequest的使用机制不同,reload刷新失效
- Codeforces Round #201 (Div. 2)
- 【9506】最佳调度问题
- Can't adjust the time of day: Invalid argument
- 企业SEO:你要排名还是要收入?
- OpenGLES Android篇零基础系列(三):OpenGL ES的渲染管道及VertexShader与FragmentShader
- VS2015不能单步调试
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- 贪心——Happy Line (CodeForces 549G)
- websocket 心跳包重连
- js获得昨天、今天、明天等时间