題目描述:輸入n個學生的資訊,然後進行查詢。
輸入:輸入的第一行為n,即學生的個數(n<=1000)
接下來的n行包括n個學生的資訊,資訊格式如下:
01 李江 男 21
02 劉唐 男 23
03 張軍 男 19
04 王娜 女 19
然後輸入乙個m(m<=10000),接下來會有m行,代表m次查詢,每行輸入乙個學號,格式如下:
0203
0104
輸出:輸出m行,每行包括乙個對應於查詢的學生的資訊。
如果沒有對應的學生資訊,則輸出「no answer!」
樣例輸入:
401 李江 男 21
02 劉唐 男 23
03 張軍 男 19
04 王娜 女 19502
0301
0403
樣例輸出:
02 劉唐 男 2303 張軍 男 19
01 李江 男 21
04 王娜 女 19
03 張軍 男 19
**:
#include #include #include using namespace std;
struct student stu[1001];
bool cmp(student a, student b)
int main()
else if(tmp>0)
high = mid - 1;
else
low = mid + 1;
}if(ans == -1)
printf("no answer!\n");
else
printf("%s %s %s %d\n",stu[ans].id,stu[ans].name,stu[ans].***,stu[ans].age);}}
return 0;
}
本題,剛開始容易想成在陣列中按普通的方法查詢(線性遍歷)特定字段。但是要注意演算法複雜度。100000 * 1000 已經超過了千萬的級別,因此不符合題目的要求。
那麼應該怎麼辦?沒錯,就是二分查詢,每次查詢的複雜度為o(lgn)。
1.對陣列元素按學號的公升序排列,可以用sort函式。
2.使用二分查詢特定的元素是否存在。二分查詢中,while迴圈的迴圈條件為high>=low。
3.定義乙個ans,目的下標值,初始為-1。
二分查詢除了用於查詢某特定元素是否存在外,還有乙個主要應用,即定界。如:在乙個有序序列中,尋找乙個下標點,使在該下標點以下(包括自己)的數字均小於等於目標數字,陣列的其餘部分大於目標數字。
int low=0,high=size;
while(low<=high)
int ans = high;
題目1069 查詢學生資訊 題目18
不再貼了,這道題需要注意 學號不能用int表示,其可能為100位,名字的長度也要夠長 坑 其次輸入的資訊不是排好序的,需要自己排序再用二分法查詢!題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 ...
1069 查詢學生的資訊
2003清華大學計算機研究生機試真題 題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 男 21 02 劉唐 男 23 03 張軍 男 19 04 王娜 女 19 然後輸入乙個m m 10000 ...
九度oj 題目1069 查詢學生資訊 字典
鏈結 題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 男 21 02 劉唐 男 23 03 張軍 男 19 04 王娜 女 19 然後輸入乙個m m 10000 接下來會有m行,代表m次查詢,每...