亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5455 | 回復(fù): 14
打印 上一主題 下一主題

華為2011校園招聘上機(jī)題目(華南和成都)一組 第三題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-05-26 11:59 |只看該作者 |倒序?yàn)g覽
在上一貼中“2012華為杯 西南賽區(qū) 初試第三題”說了GDB不少壞話。在看了《GDB調(diào)試程序[陳皓]》后,決定再找些題目試試。

歡迎任何評(píng)論!

3.操作系統(tǒng)任務(wù)調(diào)度問題。操作系統(tǒng)任務(wù)分為系統(tǒng)任務(wù)和用戶任務(wù)兩種。其中,系統(tǒng)任務(wù)的優(yōu)先級(jí) < 50,用戶任務(wù)的優(yōu)先級(jí) >= 50且 <= 255。優(yōu)先級(jí)大于255的為非法任務(wù),應(yīng)予以剔除,F(xiàn)有一任務(wù)隊(duì)列task[],長(zhǎng)度為n,task中的元素值表示任務(wù)的優(yōu)先級(jí),數(shù)值越小,優(yōu)先級(jí)越高。函數(shù)scheduler實(shí)現(xiàn)如下功能,將task[] 中的任務(wù)按照系統(tǒng)任務(wù)、用戶任務(wù)依次存放到 system_task[] 數(shù)組和 user_task[] 數(shù)組中(數(shù)組中元素的值是任務(wù)在task[] 數(shù)組中的下標(biāo)),并且優(yōu)先級(jí)高的任務(wù)排在前面,數(shù)組元素為-1表示結(jié)束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}
      system_task[] = {0, 3, 1, 7, -1}
      user_task[] = {4, 8, 2, 6, -1}

函數(shù)接口
void scheduler(int task[], int n, int system_task[], int user_task[])
  1.     #include <stdio.h>
  2.     #include <stdlib.h>

  3.     #define DEBUG 0

  4.     void scheduler(int task[], int n, int system_task[], int user_task[]);

  5.     int
  6.     main(int argc, char *argv[])
  7.     {
  8.         int n, i, j;
  9.         int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
  10.         n = sizeof(task) / sizeof(int);
  11.         int system_task[n];
  12.         int user_task[n];

  13.         scheduler(task, n, system_task, user_task);

  14.         printf("\ntask[] is :\n");
  15.         for(i = 0; i < n; i++){
  16.             printf("%d ", task[i]);
  17.         }
  18.         
  19.         printf("\n\nsystem_task[] is :\n");
  20.         for(i = 0; i < n && system_task[i] != -1; i++){
  21.             printf("%d ", system_task[i]);
  22.         }
  23.         printf("%d",system_task[i]);
  24.         
  25.         printf("\n\nuser_task[] is :\n");
  26.         for(i = 0; i < n && user_task[i] != -1; i++){
  27.             printf("%d ", user_task[i]);
  28.         }
  29.         printf("%d", user_task[i]);
  30.         printf("\n");

  31.     }

  32.     /*
  33.      *scheduler處理函數(shù)
  34.      */
  35.     void
  36.     scheduler(int task[], int n, int system_task[],int user_task[])
  37.     {
  38.         int i, j, min_val;
  39.         int min_in_task_ptr;
  40.         int *fill_ptr;
  41.         int *task_ptr[n];
  42.         int **tmp_ptr_ptr;

  43.         for(i = 0; i < n; i++){
  44.             task_ptr[i] = &task[i];
  45.         }

  46.         /*將task_ptr[]從小到大的排列*/
  47.         for(i = 0; i < n; i++){
  48.             min_val = *task_ptr[i];
  49.             min_in_task_ptr = i;
  50.             fill_ptr = task_ptr[i];

  51.             /*尋找task_ptr后面的最小值和它的指針*/
  52.             for(j = i; j < n; j++){
  53.                 if(*task_ptr[j] < min_val){
  54.                     min_val = *task_ptr[j];
  55.                     min_in_task_ptr = j;
  56.                 }
  57.             }
  58.     #if DEBUG
  59.             printf("min_val:%d min_ptr:%d ", min_val, *task_ptr[min_in_task_ptr]);
  60.             printf("min_ptr-task:%d\n", min_in_task_ptr);
  61.     #endif

  62.             /*交換指針*/
  63.             task_ptr[i] = task_ptr[min_in_task_ptr];
  64.             /*min_ptr-task怎么和我期望的有差距呢?
  65.              * 哦,task數(shù)組中的數(shù)據(jù)順序沒有變化。
  66.              * */
  67.             //task_ptr[i] = task_ptr[min_ptr - task];
  68.             task_ptr[min_in_task_ptr] = fill_ptr;
  69.     #if DEBUG
  70.             printf("%d\ttask_ptr[] is :", i);
  71.             for(j = 0; j < n; j++){
  72.                 printf("%d ", *task_ptr[j]);
  73.             }
  74.             printf("\n");
  75.     #endif

  76.         }

  77.         int count_sys = 0;
  78.         int count_user = 0;

  79.         for(i = 0; i < n; i++){
  80.             if(*task_ptr[i] < 50){
  81.                 system_task[count_sys] = task_ptr[i] - task;
  82.                 count_sys++;
  83.             } else if(*task_ptr[i] > 255){
  84.                 printf("%d", *task_ptr[i]);
  85.             } else {
  86.                 user_task[count_user] = task_ptr[i] - task;
  87.                 count_user++;
  88.             }
  89.         }
  90.         system_task[count_sys] = -1;
  91.         user_task[count_user] = -1;
  92.     }
復(fù)制代碼
總結(jié):
看到一個(gè)師弟對(duì)這個(gè)三道題目的評(píng)價(jià)“其實(shí)就是邏輯思維,根本不涉及庫函數(shù)算法神馬的。。!
嗯,對(duì)于我來說,著重練習(xí)的是邏輯思維,GDB調(diào)試。

編這三個(gè)練習(xí)的時(shí)候我感覺到比華為杯2012西南賽區(qū)初賽題目要順手一些。特別是對(duì)于調(diào)試也“身”有體會(huì)了。看了《GDB調(diào)試程序[陳皓]》后,感覺原來GDB還不錯(cuò)。同時(shí),也喜歡上了在程序中加上條件編譯,這樣調(diào)試程序就更方便了。目前我的調(diào)試前后的時(shí)間各占了一半,我還會(huì)做得更好的。

喜歡GDB的打印數(shù)組 p *task_ptr[0]@9 。開始對(duì)這個(gè)的理解錯(cuò)誤,運(yùn)行結(jié)果讓我匪夷所思。原來
p task_ptr[0]@9 才是打印排了序的指針。但顯示的是指針,不容易閱讀。此時(shí),我想起了條件編譯,感覺不錯(cuò)。

在第三個(gè)練習(xí)中,用了指針數(shù)組,用得還不太熟悉。(暫且忽略解決方法的好壞~)盡管看書的時(shí)候,指針的應(yīng)用都能理解,但和自己動(dòng)手相比差別還是大。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-05-27 12:03 |只看該作者
本帖最后由 lqfhvk357 于 2012-05-29 10:46 編輯

我也寫了個(gè)...
  1. #define N 10

  2. #include <iostream.h>
  3. void scheduler(int task[], int n, int system_task[], int user_task[])
  4. {
  5.         int i, h;
  6.         int k_s, k_u;
  7.         k_s=0, k_u=0;
  8.         for(i=0; i<n; i++)
  9.         {
  10.                 if(task[i]<50)
  11.                 {
  12.                         system_task[k_s++]=i;
  13.                         h=k_s;
  14.                         while(h>1)
  15.                         {       
  16.                                 if(task[system_task[h-1]]<task[system_task[h-2]])
  17.                                 {
  18.                                         system_task[h-1]=system_task[h-1]+system_task[h-2],
  19.                                         system_task[h-2]=system_task[h-1]-system_task[h-2],
  20.                                         system_task[h-1]=system_task[h-1]-system_task[h-2];
  21.                                         h--;
  22.                                 }
  23.                                 else
  24.                                         break;               
  25.                         }
  26.                 }
  27.                 else if(task[i]<=255)
  28.                 {
  29.                         user_task[k_u++]=i;
  30.                         h=k_u;
  31.                         while(h>1)
  32.                         {       
  33.                                 if(task[user_task[h-1]]<task[user_task[h-2]])
  34.                                 {
  35.                                         system_task[h-1]=system_task[h-1]+system_task[h-2],
  36.                                         system_task[h-2]=system_task[h-1]-system_task[h-2],
  37.                                         system_task[h-1]=system_task[h-1]-system_task[h-2];
  38.                                         h--;
  39.                                 }
  40.                                 else
  41.                                         break;               
  42.                         }
  43.                 }
  44.                 else
  45.                         cout<<task[i]<<":此任務(wù)為非法任務(wù)!"<<endl;
  46.         }
  47.         system_task[k_s]=-1;
  48.         user_task[k_u]=-1;
  49.         cout<<"system_task:"<<endl;
  50.         for(i=0; i<k_s+1; i++)
  51.                 cout<<system_task[i]<<" ";
  52.         cout<<endl<<"user_task:"<<endl;
  53.         for(i=0; i<k_u+1; i++)
  54.                 cout<<user_task[i]<<" ";
  55. }

  56. int main()
  57. {
  58.         int  i;
  59.         int a[N];
  60.         int b[N];
  61.         int c[N];

  62.         cout<<"請(qǐng)輸入十個(gè)整數(shù):"<<endl;
  63.         for(i=0; i<N; i++)
  64.                 cin>>a[i];
  65.         scheduler(a, N, b, c);
  66.         return 0;
  67. }
復(fù)制代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-05-27 15:02 |只看該作者
優(yōu)先級(jí)相同,這個(gè)時(shí)候又有另外一些要考慮的,比如是否序列穩(wěn)定。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-05-27 17:03 |只看該作者
本帖最后由 walleeee 于 2012-05-27 17:05 編輯
  1. // the original priority scheduler design is not right.
  2. // it should not be design as that, it's slow. i think
  3. // the scheduler should use mutil-level list/queue to
  4. // store process, which in scheuler list.

  5. // but here i use mutil-level fixed array just for
  6. // convenient. lol :-)

  7. #include <stdio.h>

  8. #define PRIORITY_MIN            0x00000000
  9. #define PRIORITY_MAX            0x000000fe
  10. #define PRIORITY_LEVEL_MAX_PROC 0x0000000f
  11. #define PRIORITY_QUEUE_ROW      PRIORITY_MAX-PRIORITY_MIN+1
  12. #define PRIORITY_QUEUE_COLUMN   PRIORITY_LEVEL_MAX_PROC+1

  13. // switch for reporting error code or just filter/ignore error.
  14. #undef USE_ERROR

  15. // error code.
  16. #define ERROR_OK                    0x00000000
  17. #define ERROR_PRIORITY_OUT_RANGE    0x00000001

  18. int Scheduler(const int *allTask, int priorityQueue[PRIORITY_QUEUE_ROW][PRIORITY_QUEUE_COLUMN])
  19. {
  20.     for(int i=0; i<PRIORITY_QUEUE_ROW; ++i)
  21.     {
  22.         priorityQueue[i][0] = 0;
  23.     }

  24.     for(int i=0; allTask[i]!=-1; ++i)
  25.     {
  26.         if(allTask[i]>=PRIORITY_MIN && allTask[i]<=PRIORITY_MAX)
  27.         {
  28.             priorityQueue[allTask[i]][++priorityQueue[allTask[i]][0]] = i;
  29.         }
  30. #ifdef USE_ERROR
  31.         else
  32.         {
  33.             return ERROR_PRIORITY_OUT_RANGE;
  34.         }
  35. #endif
  36.     }

  37.     return ERROR_OK;
  38. }

  39. void DumpPriorityQueue(const int priorityQueue[PRIORITY_QUEUE_ROW][PRIORITY_QUEUE_COLUMN], int start, int end, const char *name)
  40. {
  41.     printf("[%s] ", name);
  42.     for(int i=start; i<end; ++i)
  43.     {
  44.         for(int j=1; j<=priorityQueue[i][0]; ++j)
  45.         {
  46.             printf("%d ", priorityQueue[i][j]);
  47.         }
  48.     }
  49.     printf("\n");
  50. }

  51. int main(int argc, char **argv)
  52. {
  53.     int allTask[] = {0, 30, 155, 1, 80, 300, 170, 40, 99, -1};
  54.     int priorityQueue[PRIORITY_QUEUE_ROW][PRIORITY_QUEUE_COLUMN];

  55.     Scheduler(allTask, priorityQueue);

  56.     DumpPriorityQueue(priorityQueue, 0, 50, "sys");
  57.     DumpPriorityQueue(priorityQueue, 50, 256, "usr");

  58.     return 0;
  59. }
復(fù)制代碼
大概寫了下,不過沒考慮題目要求
另外,那個(gè)多級(jí)映射,看不懂就算了,其實(shí)該用多維線性表,我用數(shù)組方便了
核心代碼就是scheduler函數(shù)

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
5 [報(bào)告]
發(fā)表于 2012-05-27 22:14 |只看該作者
要我寫的話,先計(jì)數(shù)排序把task理順了然后一次遍歷放到兩個(gè)task里。4N的時(shí)間復(fù)雜度

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-05-28 00:14 |只看該作者
本帖最后由 時(shí)間看來 于 2012-05-28 00:27 編輯

回復(fù) 2# lqfhvk357


嗯,測(cè)試通過!
思想是:先把任務(wù)分類,再排序。時(shí)間復(fù)雜度我沒有計(jì)算
Tips:
編程的風(fēng)格還需要注意下:比如 = 左右兩邊的的空格 是否需要?
在CU中有帖代碼行的HTML標(biāo)簽 “<>”,不然程序貼出來有的內(nèi)容可能改變。

我嘗試將元素改成254個(gè),將程序運(yùn)行100遍。來分析這三個(gè)程序的運(yùn)行時(shí)間,到目前為止都顯示的0.01秒。
非常感謝您的時(shí)間!

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-05-28 00:21 |只看該作者
回復(fù) 4# walleeee


嗯,看懂了。
數(shù)組第一個(gè)元素用于計(jì)數(shù)……
同一個(gè)優(yōu)先級(jí)的一個(gè)隊(duì)列/線性表……

看過內(nèi)核的就是不一樣~

我嘗試將元素改成254個(gè),將程序運(yùn)行100遍。來分析這三個(gè)程序的運(yùn)行時(shí)間,到目前為止都顯示的0.01秒。
非常感謝您的時(shí)間!

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-05-28 00:23 |只看該作者
本帖最后由 時(shí)間看來 于 2012-05-28 12:35 編輯

回復(fù) 5# cokeboL


時(shí)間復(fù)雜度,我還沒有考慮哦~

這三個(gè)程序的時(shí)間復(fù)雜度,可能大牛一眼就看出來了。我還達(dá)不到

睡覺了,GOOD NIGHT~

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
9 [報(bào)告]
發(fā)表于 2012-05-29 00:03 |只看該作者
本帖最后由 cokeboL 于 2012-05-29 00:04 編輯
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void task_sort(int task[], int task_num, int max_task_num)
  4. {
  5.         int i, j;
  6.         int *count = (int*)malloc(sizeof(int)*max_task_num);

  7.         for(i=0; i<max_task_num; i++){
  8.                 count[i]=0;
  9.         }

  10.         for(i=0; i<task_num; i++){
  11.                 count[task[i]]++;
  12.         }

  13.         for(i=0, j=0; i<task_num; j++){
  14.                 while( (count[j]-- > 0) && i<task_num ){
  15.                         task[i++] = j;
  16.                 }
  17.         }

  18.         free(count);
  19. }

  20. void Scheduler(int task[], int task_num, int max_task_num, int system_task[], int user_task[])
  21. {
  22.         int i=0, n=0;
  23.         task_sort(task, task_num, max_task_num);
  24.         while(task[n]<50){
  25.                 system_task[n]=n++;
  26.         }
  27.         system_task[n]=-1;
  28.         while(task[n]<=255){
  29.                 user_task[i++]=n++;
  30.         }
  31.         user_task[n]=-1;
  32. }

  33. int main()
  34. {
  35.        
  36.         int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99},
  37.                 system_task[20],
  38.                 user_task[20];
  39.         Scheduler(task, sizeof(task)/sizeof(int), 300, system_task, user_task);
  40.        
  41.         return 0;
  42. }
復(fù)制代碼
e,3n+255

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-05-29 10:35 |只看該作者
本帖最后由 lqfhvk357 于 2012-05-29 21:19 編輯

回復(fù) 9# cokeboL
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP