1. 程式人生 > >Every Effort Counts

Every Effort Counts

算例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)
    使用形式:sort(first_pointer,first_pointer+n,cmp);cmp為自定義比較函式名稱,不寫預設為升序排序

算例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;
}

  • 注意點 ①過載<要是不熟悉,趕緊掌握(背下來)~

在這裡插入圖片描述