当前位置:编程学习 > C/C++ >>

五连击数组

前言
每天必须看道算法题目才能安心啊,毕竟是快到9月份找工作的关键时刻了。最近忙得快跪了,一周下来到周五眼睛必然是极度充血的状态,没办法,需要学习和复习的东西太多,加上还有项目上的任务,罗列几个主要的任务:
看完剑指offer,7月14日前必须完成
边做准信项目边学习redis源码,项目在7月21日前必须将服务器端代码完成
学习php内核一些知识,这个看时间情况吧
信息检索,兼顾论文,估计7月14到7月21日我需要拿出一周来突击论文,请假就好了
一直以来工作上最深的感触就是孤独,中科院的一哥们跟我感觉类似,我发现自己也是个人才,有非常好的忍耐力和意志力,特别能坚持,到了研究生这个阶段,之所以能拉开差距关键就是你是否坚持了你想学习的东西和做人的准则(ps:天才除外)


题目
[html]  题目描述: 
在任意一个数组当中,若你能找出有五个及五个以上的连续元素时,我们就称它为五连击数组。但是这种数组并不是时常会有,你的任务就是通过增加最少的元素,使一个数组成为一个五连击数组。 
输入: 
每个测试文件包含多个测试案例,每个测试案例包括两行。 
第一行代表输入数组的元素个数N,其中0 < N <= 1000。 
第二行则包含有N个非负整数,代表数组的元素。 
输出: 
对于每一个测试案例输出一行,代表最少需要添加的元素数,使得数组成为一个五连击数组。 
样例输入: 

1 3 4 


样例输出: 

题目描述:
在任意一个数组当中,若你能找出有五个及五个以上的连续元素时,我们就称它为五连击数组。但是这种数组并不是时常会有,你的任务就是通过增加最少的元素,使一个数组成为一个五连击数组。
输入:
每个测试文件包含多个测试案例,每个测试案例包括两行。
第一行代表输入数组的元素个数N,其中0 < N <= 1000。
第二行则包含有N个非负整数,代表数组的元素。
输出:
对于每一个测试案例输出一行,代表最少需要添加的元素数,使得数组成为一个五连击数组。
样例输入:
3
1 3 4
1
1
样例输出:
2
4

思路
一个三星很水的题目,因为有负数的存在,不方便直接用hash数组实现,所以可以考虑:
快速排序
依次遍历每个数,记录最小能实现num+4的值,输出即可
自己模拟了一下快排,当作算法回顾了


AC代码
 

 #include <stdio.h>   
#include <stdlib.h>   
   
int pivot_partition(int *arr, int left, int right);  
void quick_sort(int *arr, int begin, int end);  
int in_array(int *arr, int n, int data);  
   
int main(void)  
{  
    int i, j, min, count, n, *arr;  
   
    while (scanf("%d", &n) != EOF) {  
        arr = (int *)malloc(sizeof(int) * n);  
        for (i = 0; i < n; i ++)  
            scanf("%d", arr + i);  
   
        quick_sort(arr, 0, n - 1);  
   
        /* 测试 
        for (i = 0; i < n; i ++) 
            printf("%d ", arr[i]); 
        printf("\n"); 
        */  
   
        for (i = 0; i < n; i ++) {  
            for (j = arr[i], count = 0; j <= arr[i] + 4; j ++) {  
                if (in_array(arr, n, j))  
                    continue;  
                else  
                    count ++;  
            }  
            if (i == 0) {  
                min = count;  
            } else {  
                min = (min < count) ? min : count;  
            }  
        }  
   
        printf("%d\n", min);  
        free(arr);  
    }  
   
    return 0;  
}  
   
int in_array(int *arr, int n, int data)  
{  
    int i, flag = 0;  
   
    for (i = 0; i < n; i ++) {  
        if (arr[i] == data) {  
            flag = 1;  
            break;  
        }  
    }  
   
    return flag;  
}  
   
void quick_sort(int *arr, int begin, int end)  
{  
    int pivot;  
   
    if (begin < end) {  
        pivot = pivot_partition(arr, begin, end);  
        quick_sort(arr, begin, pivot - 1);  
        quick_sort(arr, pivot + 1, end);  
    }  
}  
   
   
int pivot_partition(int *arr, int left, int right)  
{  
    int stand = arr[left];  
   
    while (left < right) {  
        while (left < right && arr[right] >= stand)  
            right --;  
        if (left < right)  
            arr[left ++] = arr[right];  
           
        while (left < right && arr[left] <= stand)  
            left ++;  
        if (left < right)  
            arr[right --] = arr[left];  
    }  
    arr[left] = stand;  
    return left;  
}  
/************************************************************** 
    Problem: 1394 
    User: wangzhengyi 
    Language: C 
    Result: Accepted 
    Time:0 ms 
    Memory:912 kb 
****************************************************************/  

#include <stdio.h>
#include <stdlib.h>
 
int pivot_partition(int *arr, int left, int right);
void quick_sort(int *arr, int begin, int end);
int in_array(int *arr, int n, int data);
 
int main(void)
{
    int i, j, min, count, n, *arr;
 
    while (scanf("%d", &n) != EOF) {
        arr = (int *)malloc(sizeof(int) * n);
        for (i = 0; i < n; i ++)
            scanf("%d", arr + i);
 
        quick_sort(arr, 0, n - 1);
 
        /* 测试
        for (i = 0; i < n; i ++)
            printf("%d ", arr[i]);
        printf("\n");
        */
 
        for (i = 0; i < n; i ++) {
            for (j = arr[i], count = 0; j <= arr[i] + 4; j ++) {
                if (in_array(arr, n, j))
                    continue;
                else
                    count ++;
            }
            if (i == 0) {
                min = count;
            } else {
                min = (min < count) ? min : count;
            }
        }
 
        printf("%d\n", min);
        free(arr);
    }
 
    return 0;
}
 
int in_array(int *arr, int n, int data)
{
    int i, flag = 0;
 
    for (i = 0; i < n; i ++) {
        if (arr[i] == data) {
            flag = 1;
            break;
        }
    }
 
    return flag;
}
 
void quick_sort(int *arr, int begin, int end)
{
    int pivot;
 
    if (begin < end) {
        pivot = pivot_partition(arr, begin, end);
        quick_sort(arr, begin, pivot - 1);
        quick_sort(arr, pivot + 1, end);
    }
}
 
 
int pivot_partition(int *arr, int left, int right)
{
    int stand = arr[left];
 
    while (left < right) {
        while (left < right && arr[right] >= stand)
            right --;
        if (left < right)
            arr[left ++] = arr[right];
         
        while (left < right && arr[left] <= stand)
            left ++;
        if (left < right)
            arr[right --] = arr[left];
    }
    arr[left] = stand;
    return left;
}
/**************************************************************
    Problem: 1394
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,