解题思路:
按照优先级排序,从优先级最高开始遍历,同时维护一个当前时间,如果当前时间小于预定时间,则ans等于预定,否则计算至少需要加上多少个Di才能大于等于ans,再将ans赋值。
解题思路:
题目要求最短周转时间,其实就是使用可剥夺的短作业优先调度。采用优先队列实现。
还是维护一个当前时间now,答案ans。
从最先到达的作业开始遍历。
将当前作业加入优先队列。
记录下一个到达时间。
优先队列出队直到为空或者做完作业的时间大于下一个到达时间。
无论下次到达是选择继续之前的还是开始新的,都中断统一处理。
解题思路:
翻转一个区间,设-1表示玫瑰,1表示牡丹,区间和为x,那么这个x可以分为x个区间,每个区间和为1,说明区间变化是连续的。只需要找到最大区间和和最小区间和,就可以算出答案。当时又犯病了,最大区间和都忘了(
package org.example; import java.util.List; import java.util.Scanner; public class MyClass { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); int[] arr=new int[n]; for(int i=0;i<n;i++){ arr[i]=scanner.nextInt(); if(arr[i]==0){ arr[i]=-1; } } int maxn=0,minn=0; int maxAns=0,minAns=n; for(int i=0;i<n;i++){ maxn+=arr[i]; minn+=arr[i]; if(maxn<0){ maxn=0; } if(minn>0){ minn=0; } maxAns=Math.max(maxAns,maxn); minAns=Math.min(minAns,minn); } System.out.println(Math.max(maxAns,-minAns)+1); } }
难度:区域赛铜牌题目,一股ACM味儿
题意:
哈希函数为f = x % n , 给定一个插入完成的哈希表,要求还原插入顺序,如果多个可能,还原字典序最小的
题解:
很容易想到使用拓扑排序,对于从i位置跳到j位置的数字, 将[i,j-1]的所有点连向j,然后进行拓扑排序+贪心就行,时间复杂度n^2 , 不行
可以考虑优化,删除一个数字之后,一定是右边最靠近这个数字可能被选,可以压进优先队列中,查找右边那个数字可以考虑使用树状数组+二分,时间复杂度nlg^2n
#include<bits/stdc++.h> using namespace std; #define ll long long //坐标从0开始直接用的树状数组 template <typename T> class Fenwick { private: int n; vector<T> c; int lowbits(int x){ return (-x) & x; } int pre_sum(int i){ int re = 0; for (; i > 0; i -= lowbits(i)) re += c[i]; return re; } public: explicit Fenwick<T>(vector<T> v){ this->n = v.size(); this->c = vector<T>(n+1,0); for(int i=0;i<n;i++) add(i,v[i]); }; void add(int i, int val){ ++i; for (;i<=n; i += lowbits(i)) c[i] += val; } int range_sum(int i,int j){ ++i;++j; return pre_sum(j) - pre_sum(i - 1); } }; void solve(){ int n;cin>>n; vector<int> a(n); for(int &x:a) cin>>x; priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq; map<int,int> mp; for(int i =0;i<n;i++){ if(a[i]==-1) a[i] = 0; else if(a[i]%n==i){ pq.push({a[i],i}); mp[a[i]] = 1; } } for(int i =0 ;i < n;i++) a.push_back(a[i]); vector<int> b = a; for(int&x:b) if(x) x = 1; Fenwick<int> fw(b); vector<int> ans; while(pq.size()){ auto p = pq.top();pq.pop(); int x = p.first , pos = p.second; ans.push_back(x); fw.add(pos,-1);fw.add(pos+n,-1); int l = pos , r = 2*n; while(l+1!=r){ int m = l+r>>1; if(fw.range_sum(pos,m)==0) l = m; else r = m; } l++; if(l<2*n&&fw.range_sum(pos,l)==1){ if(mp[a[l]]) continue; int lp = a[l]%n; if(lp > l) l+=n; if(fw.range_sum(lp, l - 1)==0){ mp[a[l]] = 1; if(l >= n ) l -= n; pq.push({a[l],l}); } } } for(int x:ans) cout<<x<<" "; } signed main(){ cin.tie(0);cout.tie(0); ios::sync_with_stdio(0); solve(); }
第四题转载于LittleXi大佬
链接:https://www.nowcoder.com/discuss/652260938636087296?sourceSSR=users
来源:牛客网