Every Effort Counts
阿新 • • 發佈:2018-12-18
算例1
- 題目描述
- 解題思路 ①氣泡排序的時間複雜度為O(待排序個數的平方),在這裡是O(n^2),且1<=n<=100,故此題數量級在萬級別,符合要求 ②氣泡排序的空間複雜度為O(n),即大致需要100*32bit(???),沒超過限制條件,符合要求
- 解題程式碼
#include <stdio.h>
void main(){
int n,A[100];
while(scanf("%d",&n)!=EOF){//①
for (int i=0;i<n;i++)
scanf("%d",&A[i]);
for (int i=0;i<n;i++ )
for (int j=i+1;j<n;j++){
if (A[i]>A[j]){
int temp;
temp=A[j];
A[j]=A[i];
A[i]=temp;
}
}
for (int i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
}
}
- 注意點
①EOF與NULL的區別:
EOF值為-1,只是普通的整型常量,一般用於輸入函式,比如scanf, 或者各種讀檔案操作函式等。當返回EOF時代表讀函數出錯,達到了檔案尾
NULL值為0,是指標,一般用作指標操作,包括指標型別賦初始值,返回指標型別的函式在出錯時的返回值等
(經測試,兩者在這裡都可以)
②在VC6.0中,退出for迴圈後,指示變數i依舊可見
③若輸入的是字串,且用的是gets()方法讀入,則while迴圈判斷改成while(gets(字串變數))
算例2
- 題目描述 將原題條件修改n的取值為1<=n<=10000?
- 解題思路 時間複雜度已經查過了百萬數量級,需要使用快速排序、歸併排序等有更優複雜度的排序演算法 c++已經為我們編寫了快速排序的庫函式
- 解題程式碼
#include <stdio.h>
#include <algorithm>
using namespace std;
//````````````````
sort(A,A+n);
//`````````````````
- 注意點
①sort函式:並不是簡單的快速排序,而是結合了堆排序和插入排序,可以根據輸入陣列的特點進行選擇。比如資料量較大時採用快排,分段遞迴,每段數量較小後採用插入,如果遞迴太深,採用堆排序
時間複雜度為n*lg(n)
算例3
- 題目描述 將原題條件修改為 降序排序
- 解題思路 ①方案一:降序排序後,將陣列倒序輸出 ②方案二:編寫cmp函式自定義降序排序規則
- 解題程式碼
#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n , A[100];
while(scanf("%d",&n)!=EOF){
for (int i=0;i<n;i++)
scanf("%d",&A[i]);
sort(A,A+n,cmp);
for (int i = 0;i < n;i ++)
printf( "%d " ,A[i]);
printf ( "\n" );
}
return 0;
}
- 注意點 ①當cmp函式返回true時,表示第一個引數x會排在第二個引數y前面,算例中表示,當x>y時,s排在y前面 ②其可以為int、double、char等型別資料排序
算例4
- 題目描述
- 解題思路 ①這裡需要對結構體進行排序,使用sort自定義比較函式cmp會比較方便
- 解題程式碼
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct stu {
char name[100];//②
int age;
int score;
}s[1000];
bool cmp(stu A, stu B) { //①
if (A.score != B.score)
return (A.score < B.score);
if (strcmp(A.name, B.name) != 0)
return (strcmp(A.name, B.name) < 0);
else
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", s[i].name, &s[i].age, &s[i].score);
sort(s, s + N, cmp);
for (int i = 0;i < N;i++)
printf("%s %d %d\n", s[i].name, s[i].age, s[i].score);
}
return 0;
}
- 注意點 ①重點注意cmp函式的寫法 ②scanf("%s",s[i].name) 不用& ③關於char的輸出:
i. 滿10個字元輸出
char a[10];
for (int i=0;i<10;i++)
scanf("%c",&a[i]);
for (int i=0;i<10;i++)
printf("%c",a[i]);
ii. 輸出錯誤
char a[10];
for (int i=0;i<10;i++)
scanf("%c",&a[i]);
printf("%s",a);
char a[10];
scanf("%s",&a);
for (int i=0;i<10;i++)
printf("%c",a[i]);
iii.輸出正確
char a[10];
scanf("%s",a);
printf("%s",a);
算例5
- 題目描述 用過載<符號方法實現結構體排序(按上題)
- 解題思路 ①過載一個結構體比大小的符號,讓系統知道結構體是這樣比大小的哦!然後就不用編寫cmp函數了
- 解題程式碼
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct stu {
char name[100];
int age;
int score;
bool operator < (const stu& t)const {
if (score != t.score)
return (score < t.score);
if (strcmp(name, t.name) != 0)
return (strcmp(name, t.name) < 0);
else
return (age < t.age);
}
}s[1000];
int main(){
int N;
while (scanf("%d", &N) != EOF) {
for (int i = 0; i < N;i++) {
scanf("%s%d%d", s[i].name, &s[i].age, &s[i].score);
}
sort(s, s+N);
for (int i = 0;i < N;i++)
printf("%s %d %d\n", s[i].name, s[i].age , s[i].score);
}
return 0;
}
- 注意點 ①過載<要是不熟悉,趕緊掌握(背下來)~