查詢學生資訊 九度教程第18題

2021-09-17 05:36:04 字數 2100 閱讀 3446

題目描述:

輸入n個學生的資訊,然後進行查詢。

輸入:

輸入的第一行為n,即學生的個數(n<=1000)

接下來的n行包括n個學生的資訊,資訊格式如下:

01 李江 男 21

02 劉唐 男 23

03 張軍 男 19

04 王娜 女 19

然後輸入乙個m(m<=10000),接下來會有m行,代表m次查詢,每行輸入乙個學號,格式如下:

02

0301

04

輸出:

輸出m行,每行包括乙個對應於查詢的學生的資訊。

如果沒有對應的學生資訊,則輸出「no answer!」

樣例輸入:

4

01 李江 男 21

02 劉唐 男 23

03 張軍 男 19

04 王娜 女 19502

0301

0403

樣例輸出:

02 劉唐 男 23

03 張軍 男 19

01 李江 男 21

04 王娜 女 19

03 張軍 男 19

注意點

如何處理多行輸入資料?

輸入學生資訊的一行資料以什麼資料結構存放?每個字段如何定義型別(字元or整型)

用什麼查詢方式來處理每個查詢請求?

回答一下

同樣地,用while(scanf("%d",&n)!=eof)來控制多行輸入,其中n為輸入的第乙個數:學生總人數

以前面題目的經驗知道,對於一行學生資訊來講,用結構體存放比較好。其中注意第乙個學號字段,最好定義為字元陣列而非整型,因為給的測試用例為0開頭的序號,不是整型的標準形式

對於每個查詢請求,最簡單的思路是都遍歷一遍所有的學生資訊依次比對,這樣的時間複雜度為o(m*n),由於m、n都很大,達到了千萬數量級,所以我們用二分查詢來減少複雜度。但是要注意,使用二分查詢需要先對學生資訊進行排序。

**

#include

#include

#include

using namespace std;

struct student

; student buf[

1000];

//buf存放學生資訊

bool cmp

(student a,student b)

intmain()

sort

(buf,buf+n,cmp)

;//二分查詢前需要先排序,這裡為公升序從小到大排列,用定義的cmp規則

int t;

// 查詢請求個數

char x[30]

;// 查詢的序號

scanf

("%d"

,&t)

;// t<10000

for(

int j=

0;j(strcmp

(buf[mid]

.no,x)

<0)

else high=mid-1;

}if(argofsorted==-1

)else

query_buf[j]

=argofsorted;

//依次把查詢請求的結果存放到query_buf中

}for

(int k=

0;kreturn0;

}

**中要注意的地方:

使用sort函式時傳入自定義的規則,規則定義函式中傳入的引數型別要和例子中一致,比如說本例中就傳入的引數就必須是結構體型別,然後通過比較該結構體中目標字段返回結果。

因為例子中對於每個查詢請求不能直接輸入查詢結果,所以我們處理的時候只能把這個結果存放到另外乙個變數query_buf中,最後一起列印出來結果。

查詢學生資訊 九度教程第18題

若依舊採用每次詢問時線性遍歷陣列來查詢是否存在我們需要查詢的元素,那麼,該演算法的時間複雜度達到了o n m 查詢次數 每次查詢所需比較的個數 而這已經達到了千萬數量級。include include struct student int main buf 1000 int main 輸入 sort...

九度1069 查詢學生資訊(折半 線性查詢)

題目1069 查詢學生資訊 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 7855 解決 2124 題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 男 21 02 劉唐 男 23 ...

Day of week 九度教程第7題

其大意為,輸入乙個日期,要求輸出該日期為星期幾。星期幾是以七為週期迴圈的,那麼只需要知道 1.今天是星期幾 2.今天和所給定的那天相隔幾天。利用其對7求餘數便可以知道所給定的那天是星期幾。include include define isleapyeap x x 100 0 x 4 0 x 400 ...