首页 > 编程语言 >SSTF算法

SSTF算法

时间:2023-05-30 22:45:18浏览次数:39  
标签:tasks dist min int 算法 now SSTF ri

oj:

https://codefun2000.com/p/P1269

学一个新东西

multiset

里面是排好序的

可以存重复的值

但是里面的值不能被修改 否则就不能排序了

可以用lower_bound(x),得到multiset中大于等于x的最小的数的位置

auto ri = q.lower_bound(x)

若x比multiset中的任何数字都要大,则会返回q.end()

*ri索引到位置上的值

upper_bound(x)则是返回大于x的最小的数的位置 其他一样的

 1 #include <iostream>
 2 #include <set>
 3 #include <algorithm>
 4 using namespace std;
 5 #define int long long
 6 const int N = 100010;
 7 typedef pair<int, int> PII;
 8 int n, m, k;
 9 PII tasks[N];
10 
11 signed main() {
12   ios::sync_with_stdio(0);
13   cin.tie(0);
14   cout.tie(0);
15   cin >> n >> m >> k;
16   for(int i = 1; i <= n; i++) {
17     cin >> tasks[i].second; // position
18   }
19   for(int i = 1; i <= n; i++) {
20     cin >> tasks[i].first; // time
21   }
22   sort(tasks + 1, tasks + n + 1); // order by time
23   int rest_tasks = n;
24   int now_pos = k;
25   int now_it = 1;
26   int now_time = 0; // record current time
27   multiset<int> q;
28   int res = 0;
29   while(rest_tasks--) {
30     bool wait = true;
31     while(now_it <= n && tasks[now_it].first <= now_time) {
32       q.insert(tasks[now_it++].second);
33       wait = false;
34     }
35     if(wait == true && q.size() == 0) {
36       now_time = tasks[now_it].first;
37       q.insert(tasks[now_it++].second);
38     }
39     int nextpos = -1;
40     int min_dist = 1e9;
41     auto ri = q.lower_bound(now_pos);
42     auto rm = ri;
43     if(ri != q.end()) { // if exist x that >= now_pos
44       min_dist = min(min_dist, *ri - now_pos);
45       nextpos = *ri;
46     }
47     if(ri != q.begin()) {
48       auto le = --ri;
49        if(min_dist >= (now_pos - *le)) {
50          min_dist = now_pos - *le;
51          nextpos = *le;
52          rm = le;
53        }
54     }
55     q.erase(rm);
56     res += min_dist;
57     now_time += m * min_dist;
58     now_pos = nextpos;
59   }  
60   cout << res << '\n';
61   return 0;
62 } 

 

标签:tasks,dist,min,int,算法,now,SSTF,ri
From: https://www.cnblogs.com/i-rong/p/17444728.html

相关文章

  • 基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包
    1.算法仿真效果vivado2019.2仿真结果如下:2.算法涉及理论知识概要LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和XOR操作。LFSR完全由其多项式指定。例如,6千-次多项式与每个项存在用方程x表示6+x5+x4+x3......
  • 算法学习day34贪心part03-1005、134、135
    packageLeetCode.greedypart03;/***1005.K次取反后最大化的数组和*给你一个整数数组nums和一个整数k,按以下方法修改该数组:*选择某个下标i并将nums[i]替换为-nums[i]。*重复这个过程恰好k次。可以多次选择同一个下标i。*以这种方式修改数组后,返回......
  • 代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之
    第454题.四数相加II力扣题目链接(opensnewwindow)给定四个包含整数的数组列表 A,B,C,D,计算有多少个元组(i,j,k,l) ,使得 A[i]+B[j]+C[k]+D[l]=0。为了使问题简单化,所有的A,B,C,D具有相同的长度 N,且0≤N≤500。所有整数的范围在-2^28到2^28......
  • 算法学习day32贪心part02-122、55、45
    packageLeetCode.greedypart02;/***122.买卖股票的最佳时机II*给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。*在每一天,你可以决定是否购买和/或出售股票。*你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。*返......
  • Nebula入门学习——day4 nGQL中的图查询和其他算法
    MATCH¶MATCH语句提供基于模式(pattern)匹配的搜索功能。一个MATCH语句定义了一个搜索模式,用该模式匹配存储在NebulaGraph中的数据,然后用RETURN子句检索数据。本文示例使用测试数据集basketballplayer进行演示。 我自己最喜欢用的是:(root@nebula)[basketballplayer]>MATCH(......
  • 算法 dfs —— 将二叉树 先序遍历 转为 链表
    将二叉树拆成链表中文English将一棵二叉树按照前序遍历拆解成为一个 假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。Example样例1:输入:{1,2,5,3,4,#,6}输出:{1,#,2,#,3,#,4,#,5,#,6}解释:1/\25/\\3461\2......
  • 算法 dfs 二叉树的所有路径
    480. 二叉树的所有路径给一棵二叉树,找出从根节点到叶子节点的所有路径。Example样例1:输入:{1,2,3,#,5}输出:["1->2->5","1->3"]解释:1/\23\5样例2:输入:{1,2}输出:["1->2"]解释:1/2"""DefinitionofTreeNode:classTree......
  • 算法 翻转二叉树 dfs
    翻转二叉树翻转一棵二叉树。左右子树交换。Example样例1:输入:{1,3,#}输出:{1,#,3}解释: 11 /=>\ 33样例2:输入:{1,2,3,#,#,4}输出:{1,3,2,#,4}解释: 11/\/\23=>32/\4......
  • 算法——dfs 判断是否为BST
    95. 验证二叉查找树中文English给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:节点的左子树中的值要严格小于该节点的值。节点的右子树中的值要严格大于该节点的值。左右子树也必须是二叉查找树。一个节点的树也是二叉查找树。Example样例1:输入:{-1}输出:true解......
  • 排列算法问题
    |类循环排列#treeDFSdefloop_permutation(arr,depth,path,result):ifdepth==len(arr):result.append(list(path))returnforninarr:path.append(n)loop_permutation(arr,depth+1,path,result)path.pop(......