算法实战(五)

基本编程题

  • 题目来源([PAT题目](https://pintia.cn/problem-sets/14/exam/problems/type/6))
    • 7-27 冒泡法排序
      • 题目
      • 题解
    • 7-28 猴子选大王
      • 题目
      • 题解

题目来源(PAT题目)

7-27 冒泡法排序

题目

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(

输入格式:
输入在第1行中给出N和K(1≤K

输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

题解

#include 
using namespace std;
void BubblrSort(int arr[], int N, int K);
void Print(int arr[],int N);

int main()
{
    int N, K;
    cin >> N >> K;
    int arr[100];
    for (int i = 0; i < N; i++)
        cin >> arr[i];
    BubblrSort(arr, N, K); // 进行冒泡排序
    Print(arr,N);          // 打印第K躺的结果
    return 0;
}

void BubblrSort(int arr[], int N, int K)
{
    for (int i = 1; i < N && i<=K; ++i)
    {
        for (int j = 0; j < N - i; ++j)
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
    }
}

void Print(int arr[],int N){
    for (int i = 0; i < N; i++){
        if (i != N - 1)     // 如果是最后一个的话不会打印多余空格
            cout << arr[i] << " ";
        else
            cout << arr[i];
    }  
}

7-28 猴子选大王

题目

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:
输入在一行中给一个正整数N(≤1000)。

输出格式:
在一行中输出当选猴王的编号。

题解

#define _CRT_SECURE_NO_WARNINGS
#include

int main() {
    int i, N, arr[1000] = {0}, count=0; // count 用于计数用
    scanf("%d", &N);
    // 把猴子编号存入数组
    for (i = 0; i < N; i++)
        arr[i] = i+1;
    i = 0;
    while (1) {
        if (arr[(i + N) % N] != 0) { // 如果该位置不为0的话,count计数++
            count++;
        }
        if (count % 3 == 0)           // 淘汰报到3的猴子,把该位置于0
            arr[(i + N) % N] = 0;
        if (count == 3 * N-2) {       // 当 count 等于 3*N-2时,刚好数组里面就剩了一个元素,此时剩余1个就是猴王,此时就可以结束循环
            printf("%d", arr[(i + N) % N]);
            break;
        }
        i++;
    }
    return 0;
}

你可能感兴趣的:(算法)