信息奥赛一本通(1180:分数线划定)——插入排序
1180:分數線劃定
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 15750 ??? 通過數: 7408
【題目描述】
世博會志愿者的選拔工作正在 A 市如火如荼的進行。為了選拔最合適的人才,A市對所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根據計劃錄取人數的150%劃定,即如果計劃錄取mm名志愿者,則面試分數線為排名第m×150%(向下取整)名的選手的分數,而最終進入面試的選手為筆試成績不低于面試分數線的所有選手。
現在就請你編寫程序劃定面試分數線,并輸出所有進入面試的選手的報名號和筆試成績。
【輸入】
第一行,兩個整數n,m(5≤n≤5000,3≤m≤n)n,m(5≤n≤5000,3≤m≤n),中間用一個空格隔開,其中n?表示報名參加筆試的選手總數,m 表示計劃錄取的志愿者人數。輸入數據保證m×150%向下取整后小于等于n。
第二行到第?n+1行,每行包括兩個整數,中間用一個空格隔開,分別是選手的報名號k(1000≤k≤9999)和該選手的筆試成績s(1≤s≤100)。數據保證選手的報名號各不相同。
【輸出】
第一行,有兩個整數,用一個空格隔開,第一個整數表示面試分數線;第二個整數為進入面試的選手的實際人數。
從第二行開始,每行包含兩個整數,中間用一個空格隔開,分別表示進入面試的選手的報名號和筆試成績,按照筆試成績從高到低輸出,如果成績相同,則按報名號由小到大的順序輸出。
【輸入樣例】
6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88【輸出樣例】
88 5 1005 95 2390 95 1000 90 1001 88 3239 88【提示】
樣例說明:m×150%=3×150%=4.5,向下取整后為4。保證4個人進入面試的分數線為88,但因為88有重分,所以所有成績大于等于88的選手都可以進入面試,故最終有5個人進入面試。
【分析】
? ? ? ? 插入排序思想:回憶一下打牌時抓牌的情景,為了方便打牌,抓牌時,一般一邊抓牌一邊按花色和大小插入恰當的位置。當讀入一個元素時,在已經排序好的序列中,搜尋正確的位置,再放入讀入的元素,但不應該忽略一個重要的問題:在插入這個元素前,應當先將它后面的所有元素后移一位,以保證插入位置的原元素不被覆蓋。
【參考代碼】
#include <stdio.h>
#define N 5010
struct node
{
?? ?int num;
?? ?int score;
}stu[N],t;
void insertion_Sort(struct node x[],int n)
{
?? ?int i,j,k;
?? ?for(i=0;i<n;i++)
?? ?{
?? ??? ?for(j=i-1;j>=0;j--) //前面有序區間中為x[i]找合適的插入位置?
?? ??? ?{
?? ??? ??? ?if(x[j].score > x[i].score) ? //找到比x[i]大的位置就退出,插入其前面?
?? ??? ??? ??? ?break;
?? ??? ??? ?else if(x[j].score==x[i].score && x[j].num < x[i].num)
?? ??? ??? ??? ?break;
?? ??? ??? ??? ?
?? ??? ?}
?? ??? ?if(j!=i-1)
?? ??? ?{
?? ??? ??? ?t=x[i]; ? ? ? ? ? ? //將比x[i]小的數據向后移?
?? ??? ??? ?for(k=i-1;k>j;k--)
?? ??? ??? ??? ?x[k+1]=x[k]; ? ?//將x[i]放在正確位置上?
?? ??? ??? ?x[k+1]=t;
?? ??? ?}
?? ?}
}
int main()
{
?? ?int i,j,n,m,f;
?? ?scanf("%d%d",&n,&m);
?? ?for(i=0;i<n;i++)
?? ??? ?scanf("%d%d",&stu[i].num,&stu[i].score);
?? ?
?? ?insertion_Sort(stu,n);
?? ?f=m*1.5;
?? ?while(stu[f].score==stu[f-1].score)
?? ?{
?? ??? ?f++;
?? ?}
?? ?printf("%d %d\n",stu[f-1].score,f);
?? ?for(i=0;i<f;i++)
?? ??? ?printf("%d %d\n",stu[i].num,stu[i].score);
?? ?return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1180
?
總結
以上是生活随笔為你收集整理的信息奥赛一本通(1180:分数线划定)——插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1077:统计满足条件
- 下一篇: 信息学奥赛一本通(1402:Vigenè