noip第20課作業


1. 評學習小標兵

【問題描述】

東東所在的班級有 N 名同學,期末考試進行了數學、語文、英語、地理四門功課的測試。班主任要將這 N 名學生中總分前三名定為本學期的“學習小標兵”。現在給出這N 名學生的姓名和各科成績,請你編程找到總分前三名,並依次輸出他們的姓名。所給數據不會有總分相同的情況(使用快速排序完成)。

【輸入格式】

輸入包含 N+1 行,第一行僅有一個正整數 N (N≤40),表示東東班里學生的總數,接下來的 N 行,每行描述一個學生的考試信息,依次為姓名、數學成績、語文成績、英語成績與地理成績,兩兩之間用一個空格分隔。注意:姓名(不會同名)都用小寫字母表示(不超過 10 個字母),成績全都是不超過 200 的非負整數。

【輸出格式】

輸出包含三行,每行僅包含一個學生的姓名,依次為第一名到第三名學生的姓名。

【樣例輸入】

4

jing 98 90 87 74

ming 96 92 85 97

jun 95 78 56 91

hong 95 100 85 78

【樣例輸出】

ming

hong

jing

#include<iostream>
using namespace std;
struct p { 
    char name[15];
    int math;
    int chinese;
    int eglish;
    int geo;
    int sum;
};
p a[110];
void quick_sort(int left,int right) {
    if(left >= right) return;
    int i = left;
    int j = right;
    p x = a[left];
    while(i < j) {
        while(i < j && a[j].sum < x.sum)
            j--;
        a[i] = a[j];
        while(i < j && a[i].sum > x.sum)
            i++;
        a[j] = a[i];
    }
    a[i] = x;
    quick_sort(left,i-1);
    quick_sort(i+1,right);
}
int main() {
    int n,f=0,s=0,i,j;
    cin>>n;
    for(i=0; i<n; i++) {
        cin>>a[i].name>>a[i].math>>a[i].chinese>>a[i].eglish>>a[i].geo;
        a[i].sum = a[i].math+a[i].chinese+a[i].eglish+a[i].geo;
    }
    quick_sort(0,n-1);
    for(i=0; i<3; i++)
        cout<<a[i].name<<endl;
    
    return 0;
}

2.挑選宇宙總統

【問題描述】

地球歷公元6036年,全宇宙准備競選一個最賢能的人當總統,共有n個非凡拔尖的人競選總統,現在票數已經統計完畢,請你算出誰能夠當上總統(使用快速排序和歸並排序完成)。

【輸入格式】

第一行為一個整數n,代表競選總統的人數。

接下來有n行,分別為第一個候選人到第n個候選人的票數。

【輸出格式】

共兩行,第一行是一個整數m,為當上總統的人的號數。

第二行是當上總統的人的選票。

說明:票數小於10000位數字。n<=20

【樣例輸入】

5

98765

12365

87954

1022356

985678

【樣例輸出】

4

1022356

#include<iostream>
#include<cstring>
#include<algorithm>
const int maxn=10010;
using namespace std;
struct node{
    string s;
    int id;
} a[maxn];
bool cmp(node x,node y){
    if(x.s.size()==y.s.size())
        return x.s>y.s;
    else return x.s.size()>y.s.size();
}
int main(){
    int n;
    cin >> n;
    for(int i=1;i<=n;++i)
        cin>>a[i].s,a[i].id=i;
    sort(a+1,a+1+n,cmp);
    cout<<a[1].id<<endl<<a[1].s; 
    return 0;
}

1.排序算法

【問題描述】

快速排序和歸並排序算法是信息學競賽的必備算法。對於快速排序和歸並排序算法還不是很熟練的同學需要多多練習,掌握后獨立完成。

【輸入格式】

輸入文件sort.in的第一行為一個正整數N,(1 ≤ N ≤ 100000)

第二行包含N個空格隔開的正整數,為你需要進行排序的數,每個數據保證不超過100000000。

【輸出格式】

輸出文件sort.out將給定的N個數從大到小輸出,數之間使用空格隔開,行末換行並且沒有空格。

【樣例輸入】

5

4 2 4 5 1

【樣例輸出】

5 4 4 2 1

#include <fstream>
using namespace std;
ifstream cin("sort.in");
ofstream cout("sort.out");
int a[1000000],n;
void quick_sort(int left,int right){
    if(left >= right) return;
    int i = left;
    int j = right;
    int x = a[left];
    while(i < j){
        while(i < j && x <= a[j]) j--;
        a[i] = a[j];
        while(i < j && x >= a[i]) i++;
        a[j] = a[i];
    }
    a[i] = x;
    quick_sort(left,i-1);
    quick_sort(i+1,right); 
}
int main(){
    cin >> n;
    for(int i = 0;i < n;i++){
        cin >>  a[i];
    }
    quick_sort(0,n-1);
    for(int i = n-1;i >=0;i--){
        cout << a[i] << " ";
    }
    cin.close();
    cout.close();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM