1. 程式人生 > >算法學習--Day1

算法學習--Day1

span -h 輸入 描述 數組 UC -c AD 如果

為了沖刺研究生初試,我準備在課余時間撿起往日的算法。多多練習算法題目,提前準備算法的機試。

今天是4月14日,距離算法考試還有兩個月的時間吧,這兩個月的所學所得我就都記錄在這裏了。不僅僅包括算法的準備,還包括英語、項目的準備。希望在兩個月後能到理想的學校去深造學習。

Come on!

開始我就從基礎的題目入手,鑒於九度oj已經gg了,我將陣地轉移到牛客網,在這裏開始刷機試題目。

第一題:

有N個學生的數據,將學生數據按成績高低排序,如果成績相同則按姓名字符的字母序排序,如果姓名的字母序也相同則按照學生的年齡排序,並輸出N個學生排序後的信息。

輸入描述:

測試數據有多組,每組輸入第一行有一個整數N(N<=1000),接下來的N行包括N個學生的數據。

每個學生的數據包括姓名(長度不超過100的字符串)、年齡(整形數)、成績(小於等於100的正數)。

輸出描述:

將學生信息按成績進行排序,成績相同的則按姓名的字母序進行排序。

然後輸出學生信息,按照如下格式:

姓名 年齡 成績

學生姓名的字母序區分字母的大小寫,如A要比a的字母序靠前(因為A的ASC碼比a的ASC碼要小)。

示例1

輸入

3

abc 20 99

bcd 19 97

bed 20 97

輸出

bcd 19 97

bed 20 97

abc 20 99

這道題目不難,把代碼放上

#include <iostream>
#include <stdio.h>
#include 
<algorithm> using namespace std; struct E{ char name[101]; int age; int grades; }buf[1000]; bool cmp(E a, E b){ if (a.grades != b.grades) return a.grades < b.grades; int cmp = strcmp(a.name,b.name); if (cmp != 0){ return cmp < 0; } return a.age<b.age; }
int main() { int n; while (scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].grades); } sort(buf,buf+n,cmp); for(int i=0;i<n;i++){ printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].grades); } } return 0; }

第二題:

題目描述

用一維數組存儲學號和成績,然後,按成績排序輸出。

輸入描述:

輸入第一行包括一個整數N(1<=N<=100),代表學生的個數。
接下來的N行每行包括兩個整數p和q,分別代表每個學生的學號和成績。

輸出描述:

按照學生的成績從小到大進行排序,並將排序後的學生信息打印出來。
如果學生的成績相同,則按照學號的大小進行從小到大排序。
示例1

輸入

3
1 90
2 87
3 92

輸出

2 87
1 90
3 92


#include <stdio.h>
#include <iostream>

#include <algorithm>
using namespace std;
struct E{
    int number;
    int scores;
}buf[101];
bool cmp(E a,E b){
    if (a.scores!=b.scores) return a.scores<b.scores;
    else{
        return a.number<b.number;
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d%d",&buf[i].number,&buf[i].scores);
    }
    sort(buf,buf+n,cmp);
    for(int i=0;i<n;i++){
    printf("%d %d\n",buf[i].number,buf[i].scores);
    }

    return 0;
}

算法學習--Day1