uva_1422 Processor

本文介绍了一种解决多个任务在规定时间内完成的问题算法。通过二分查找确定完成所有任务所需的最大速度最小值,采用优先队列优化处理任务的顺序。

题目链接

题意:

  有n个任务, 每个任务要在规定的时间[l, r]内完成, 工作量为 w, 每个任务可以分开完成。

  求, 使得所有任务都完成的最大速度的最小值。

 

思路:

  最大值最小问题, 二分。

  因为是要完成所有任务, 所以先按开始时间排序, 接下来二分速度。

  因为任意两个任务之间的关系只有两种, 1)相交或者包含 2)相切或者相离

  如果是情况 2) 那么不需要特殊处理, 按顺序处理过去即可。

  如果是情况 1) 那么需要将这个时间段内的任务按照结束时间来进行处理, 结束时间小的优先完成。

  然后枚举时间, 从1 开始处理过去, 看是否能处理完所有任务即可。

 

代码:

  

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <ctime>
  6 #include <set>
  7 #include <map>
  8 #include <list>
  9 #include <stack>
 10 #include <queue>
 11 #include <string>
 12 #include <vector>
 13 #include <fstream>
 14 #include <iterator>
 15 #include <iostream>
 16 #include <algorithm>
 17 using namespace std;
 18 #define LL long long
 19 #define INF 0x3f3f3f3f
 20 #define MOD 1000000007
 21 #define eps 1e-6
 22 #define MAXN 10010
 23 #define MAXM 100
 24 #define dd {cout<<"debug"<<endl;}
 25 #define pa {system("pause");}
 26 #define p(x) {printf("%d\n", x);}
 27 #define pd(x) {printf("%.7lf\n", x);}
 28 #define k(x) {printf("Case %d: ", ++x);}
 29 #define s(x) {scanf("%d", &x);}
 30 #define sd(x) {scanf("%lf", &x);}
 31 #define mes(x, d) {memset(x, d, sizeof(x));}
 32 #define do(i, x) for(i = 0; i < x; i ++)
 33 #define dod(i, x, l) for(i = x; i >= l; i --)
 34 #define doe(i, x) for(i = 1; i <= x; i ++)
 35 struct node
 36 {
 37     int l;
 38     int r;
 39     int t;
 40     int no;
 41     bool operator < (const struct node &y) const
 42     {
 43         return r > y.r;
 44     }
 45 };
 46 int n, sum;
 47 struct node f[MAXN];
 48 int w[MAXN];    
 49 bool cmp(const struct node &x, const struct node &y)
 50 {
 51     return x.l == y.l? x.r < y.r : x.l < y.l;
 52 }
 53 void read()
 54 {
 55     sum = 0;
 56     scanf("%d", &n);
 57     for(int i = 0; i < n; i ++)
 58     {
 59         scanf("%d %d %d", &f[i].l, &f[i].r, &f[i].t);
 60         sum += f[i].t;
 61         f[i].no = i;
 62     }
 63     sort(f, f + n, cmp);
 64 }
 65 bool is_ok(int x)
 66 {
 67     priority_queue <struct node> Q;
 68     for(int i = 0; i < n; i ++)
 69         w[f[i].no] = f[i].t;
 70     int i = 0;
 71     int pos = 1;
 72     while(true)
 73     {
 74         while(i < n && f[i].l <= pos) Q.push(f[i ++]);
 75 
 76         int ts = x;
 77         while(!Q.empty() && ts)
 78         {
 79             struct node temp = Q.top();
 80 
 81             if(temp.r <= pos) return false;
 82 
 83             w[temp.no] -= ts;
 84             if(w[temp.no] > 0)
 85                 ts = 0;
 86             else if(w[temp.no] <= 0)
 87             {
 88                 ts = -w[temp.no];
 89                 Q.pop();
 90             }
 91         }
 92 
 93         if(i == n && Q.empty()) return true;
 94         pos ++;
 95     }
 96     return false;
 97 }
 98 int get_ans()
 99 {
100     int l = 1, r = sum;
101     while(l <= r)
102     {
103         int mid = (l + r) / 2;
104         if(is_ok(mid))
105             r = mid - 1;
106         else 
107             l = mid + 1;
108     }
109     return l;
110 }
111 
112 int main()
113 {
114     int T;
115     scanf("%d", &T);
116     while(T --)
117     {
118         read();
119         printf("%d\n", get_ans());
120     }
121     return 0;
122 }
View Code

 

转载于:https://www.cnblogs.com/By-ruoyu/p/4871431.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值