這兩個題的話,都是直接考排序,雖然可以直接用庫函數的 sort
,但還是推薦自己手寫一遍快排,這個東西時間久不寫還是容易忘記。
這裏就權當是複習排序的算法了。
7-12 排序
給定N個(長整型範圍內的)整數,要求輸出從小到大排序後的結果。
本題旨在測試各種不同的排序算法在各種數據情況下的表現。各組測試數據特點如下:
數據1:只有1個元素;
數據2:11個不相同的整數,測試基本正確性;
數據3:103個隨機整數;
數據4:104個隨機整數;
數據5:105個隨機整數;
數據6:105個順序整數;
數據7:105個逆序整數;
數據8:105個基本有序的整數;
數據9:105個隨機正整數,每個數字不超過1000。
輸入格式:
輸入第一行給出正整數N(≤105),隨後一行給出N個(長整型範圍內的)整數,其間以空格分隔。
這個題目唯一需要注意的點,就是好好讀題,題目中給出的整數是長整型範圍,所以需要用到 long
。
完整代碼如下:
/*
Author: Veeupup
排序
我們可以直接用 algorithm 下的 sort
還是推薦自己把快排可以再寫一遍
*/
#include <cstdio>
#include <cstdint>
#include <algorithm>
using namespace std;
const int maxn = 1e5+5;
int n;
long arr[maxn];
// 複習快排
void quickSort(long *arr, int left, int right) {
if(left < right) {
int i = left, j = right;
long temp = arr[i];
while (i < j)
{
while(i < j && arr[j] > temp)
j--;
arr[i] = arr[j];
while(i < j && arr[i] <= temp)
i++;
arr[j] = arr[i];
}
arr[i] = temp;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%ld", &arr[i]);
}
// sort(arr, arr+n);
quickSort(arr, 0, n-1);
bool flag = false;
for (int i = 0; i < n; i++)
{
if(flag) {
printf(" %ld", arr[i]);
}else {
printf("%ld", arr[i]);
flag = true;
}
}
return 0;
}
7-13 工齡排序
這個題沒有任何好說的點,使用一個 age[]
數字來保存對應年齡出現的次數即可。
/*
Author: Veeupup
*/
#include <cstdio>
#include <cstdint>
using namespace std;
const int maxn = 55;
int n, age[maxn];
int main()
{
freopen("data.txt","r", stdin);
fill(age, age + maxn, 0);
scanf("%d", &n);
int temp;
for (int i = 0; i < n; i++)
{
scanf("%d", &temp);
age[temp]++;
}
for (int i = 0; i < maxn; i++)
{
if(age[i] != 0) {
printf("%d:%d\n", i, age[i]);
}
}
return 0;
}