[2019CSP多校联赛普及组第五周] 调度CPU (贪心)
來來來,走過路過不要錯過
- 題目
- 題解
- 代碼實現1
- 代碼實現2
題目
?Y同學有?塊超級CPU,它有兩個超級核?A和B。
A核?可以同時處理多項任務,每項任務處理時間為x,B核?只能同時處理?項任務,每項任務處理時間為y。
這?天,?Y同學接到了n項緊急任務,第i項緊急任務在ti時刻發出,且必須在任務發出時進?處理。
由于?Y可以調節CPU的B核?,你想知道對于y∈1,x,處理完畢所有任務的最早時間是多少?
輸入格式
第??兩個整數n,x,表?緊急任務數量及A核?對每項任務的處理時間。 第??n個整數ti,表?第i個緊急任務發出的時間ti。
輸出格式
共x?:第i(1≤i≤x)??個整數,表?當y=i時的答案ans。
樣例
樣例輸入1:
3 3
1 2 3
樣例輸出1:
4
5
6
樣例輸入2:
3 5
1 4 5
樣例輸出2:
6
9
9
9
10
數據范圍與提示
樣例輸入輸出解釋1:
y=1的時候:t1=1任務交給核?A,t2=2,t3=3兩個任務交給核?B,結束時刻是4,這是最早的?種完成的?案。
y=2的時候:t1=1,t3=3兩個任務交給核?B,t2=2任務交給核?A,結束時刻是5,這是最早的?種完成的?案。
y=3的時候:t1=1,t2=2兩個任務交給核?A,t3=3任務交給核?B,結束時刻是6,這是最早的?種完成的?案。
數據范圍:
對于40%的數據,1≤n≤103
對于100%的數據,1≤n,x≤106,0≤ti-1≤ti≤109
題解
初見這道題的時候,一行掃下來,貪心應該是躍然紙上,我就沒必要解釋了吧
每次拿到題一定要先觀察數據范圍
40%告訴我們:當你完全沒有思路的時候,就可以暴力得到40
100%告訴我們:我們只能運用n,x的范圍,因為1e9一秒肯定是會被T掉的
所以我們就能大概推出這份正解的時間復雜度應該是O(n)O(n)O(n)左右
貪心就更加有信心了
首先通讀題目后應該了解,求得就是最后一個任務的完成時間
我們就從最后一個開始思考
題目告訴了y永遠小于等于x
那么最后一個n任務肯定是交給y去完成,一定是優于或者等于交給x完成
所以說x?
貪心思想就呼之欲出了:
B核心只能一次進行一個任務,而A可以多個連續進行
所以最晚的完成時間就是?
n任務交給B完成的時間和最后一個任務交給A完成的時間的最大值
接下來我們就是思考如何去找到最后一個交給A完成的任務i???
我們知道,當i與j任務的時間差大于等于y的時候,i和j任務都可以由B去完成
這就啟示我們,去找到最后一個任務i的時間與n任務的時間差小于y
這個i就必須交給A去完成,作差的方法就是AC實現
因為是求最后一個,其實我們轉化一下就是從后往前找的第一個
用一個數組去存當y=i時,最后一個i的下標,這個y的處理一個n循環就可以完成了
下面分享兩種代碼,本質上應該都是一樣的,但理解可能有難易之分
代碼實現1
#include <cstdio> #include <iostream> using namespace std; #define MAXN 1000005 int n, x; int t[MAXN], result[MAXN]; int main() {scanf ( "%d %d", &n, &x );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &t[i] );int tmp = x;for ( int i = n;i > 1;i -- ) {int ip = t[i] - t[i - 1];while ( ip < tmp && tmp > 0 ) {result[tmp] = i - 1;tmp --;}if ( ! tmp ) break;}for ( int i = 1;i <= x;i ++ )printf ( "%d\n", max ( t[result[i]] + x, t[n] + i ) );return 0; }代碼實現2
#include <cstdio> #include <iostream> using namespace std; #define MAXN 1000005 int n, x; int t[MAXN], vis[MAXN]; int main() {scanf ( "%d %d", &n, &x );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &t[i] );for ( int i = n;i > 1;i -- ) {int ip = t[i] - t[i - 1];ip ++;for ( int j = ip;j <= x && ! vis[j];j ++ )vis[j] = i - 1;}for ( int i = 1;i <= x;i ++ )printf ( "%d\n", max ( t[vis[i]] + x, t[n] + i ) );return 0; }好了,這道題就到此為止,
總結
以上是生活随笔為你收集整理的[2019CSP多校联赛普及组第五周] 调度CPU (贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倒海翻江跃巨蛟是指什么生肖
- 下一篇: [Luogu2279][HNOI2003