进程分配
2016-07-17 22:24
204 查看
题目描述
对操作系统来说,进程控制很重要。每个进程运行的需要占用资源,当进程结束的时候,它所占用的资源会全部释放。因此,不同的资源分配策略就显的很重要,一些不好的策略将导致死锁。现在我们有n个进程和m种资源。起初,每个进程已经被分配了一些资源,然后这些资源可能没有达到进程运行的需求,某些类型的资源还需要额外的资源补充。现在还有部分资源你可以分配,你能告诉我,是否能设计最优策略,使得所有进程都能运行。
输入
首先输入T, 表示有组数据
对于每组数据,输入n, m。
然后输入m*n的矩阵,表示对于每个进程,针对每种资源已有多少资源量。
然后输入m*n的矩阵,表示对于每个进程,针对每种资源还缺多少资源量。
最后输入m个数,表示对于每种资源,还有多少资源可分配。
输出
对于每组数据,如果可行,输出’Yes’, 否则’No’。
样例输入
2
4 3
1 6 2 0
0 1 1 0
0 2 1 2
2 0 1 4
2 0 0 2
2 1 3 0
0 1 1
4 3
2 5 2 0
0 1 1 0
1 1 1 2
1 1 1 4
2 0 0 2
1 2 3 0
0 1 1
样例输出
Yes
No
提示
对于30%的数据: 1<=n<=500, 1<=m<=2
对于100%的数据: 1<=n<=50000, 1<=m<=3, 1<=T<=20, 矩阵里的元素范围在1000000以内
与各自的编号排序后
进行线扫
三个指针
十分精妙
对操作系统来说,进程控制很重要。每个进程运行的需要占用资源,当进程结束的时候,它所占用的资源会全部释放。因此,不同的资源分配策略就显的很重要,一些不好的策略将导致死锁。现在我们有n个进程和m种资源。起初,每个进程已经被分配了一些资源,然后这些资源可能没有达到进程运行的需求,某些类型的资源还需要额外的资源补充。现在还有部分资源你可以分配,你能告诉我,是否能设计最优策略,使得所有进程都能运行。
输入
首先输入T, 表示有组数据
对于每组数据,输入n, m。
然后输入m*n的矩阵,表示对于每个进程,针对每种资源已有多少资源量。
然后输入m*n的矩阵,表示对于每个进程,针对每种资源还缺多少资源量。
最后输入m个数,表示对于每种资源,还有多少资源可分配。
输出
对于每组数据,如果可行,输出’Yes’, 否则’No’。
样例输入
2
4 3
1 6 2 0
0 1 1 0
0 2 1 2
2 0 1 4
2 0 0 2
2 1 3 0
0 1 1
4 3
2 5 2 0
0 1 1 0
1 1 1 2
1 1 1 4
2 0 0 2
1 2 3 0
0 1 1
样例输出
Yes
No
提示
对于30%的数据: 1<=n<=500, 1<=m<=2
对于100%的数据: 1<=n<=50000, 1<=m<=3, 1<=T<=20, 矩阵里的元素范围在1000000以内
与各自的编号排序后
进行线扫
三个指针
十分精妙
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> using namespace std; struct node{ int y,id; }a[4][50005]; int T; int n,m,d[4][50005],b[50005],c[4]; bool cmp(node xx,node yy){ return xx.y<yy.y; } int main() { scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); for (int j=1;j<=n;j++) b[j]=0; for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) scanf("%d",&d[i][j]); for (int i=1;i<=m;i++){ for (int j=1;j<=n;j++){ scanf("%d",&a[i][j].y); a[i][j].id=j; } } for (int i=1;i<=m;i++) scanf("%d",&c[i]); for (int i=1;i<=m;i++) sort(a[i]+1,a[i]+n+1,cmp); int zrz=0,bo=1; int p[4]; for (int i=1;i<=m;i++) p[i]=1; while (bo) { bo=0; for (int i=1;i<=m;i++) { while (p[i]<=n && c[i]>=a[i][p[i]].y) { bo=1; int ori=a[i][p[i]].id; b[ori]++; if (b[ori]==m) { for (int ii=1;ii<=m;ii++) c[ii]+=d[ii][ori]; zrz++; } p[i]++; } } } if (zrz==n) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 在命令行用 sort 进行排序
- 如何写好 C main 函数
- 文件遍历排序函数
- 关于C#中排序函数的总结
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- C#实现Datatable排序的方法
- MYSQL必知必会读书笔记第五章之排序检索数据
- SQLSERVER的排序问题结果不是想要的
- Ruby实现插入排序算法及进阶的二路插入排序代码示例
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 深入解析桶排序算法及Node.js上JavaScript的代码实现