日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[2019CSP多校联赛普及组第五周] 调度CPU (贪心)

發布時間:2023/12/3 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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 (贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。