太阳能板的最大面积

题目描述

给航天器一侧加装长方形和正方形的太阳能板,需要先安装两个支柱,再在支柱的中间部分固定太阳能板;但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那支支柱的长度。
现提供一组整型数组的支柱高度数据,假设每个支柱间的距离相等为一个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。

输入描述

10,9,8,7,6,5,4,3,2,1
注释,支柱至少有两根,最多10000根,能支持的高度范围1~10^9的整数.
柱子的高度是无序的,例子中的递减是巧合。

输出描述

可以支持的最大太阳板面积:(10m高支柱和5m高支柱之间)
25

示例1

输入
10,9,8,7,6,5,4,3,2,1
输出
25
备注:10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高度也是5,面积为25,任取其他两根支柱所能获得的面积都小于25 所以最大面积为25。
思路分析
10米高支柱和5米高支柱之间宽度为5,柱子的高度是无序的,所以宽等于高支柱的高减去低支柱的高。高度取小的支柱高度。任取其他两根支柱所能获得的面积,取其中最大的。

测试用例

1,2,3,4,5,6,7,8,9,10
25

10,9,8,7,6,5,4,3,2,1
25

1,7,8,9,8,5,8,9
30

C语言题解:

#include <stdio.h>
#include <stdlib.h>

#define MAX 10002

int main()
{
    int arr[MAX];
    int size = 0;
    char a;
    int tmp = 0;
    // 处理输入
    do {
        a = getchar();
        if (a >= '0' && a<= '9') {
            tmp = tmp*10 + a - '0'; // 将字符串转化为数字
        } else { // ,
            arr[size++] = tmp; // 将数字存储到数组中
            tmp = 0;
        }
    } while (a != '\n');

    int area;
    int max_area = 0;
    for (int i=0; i<size; i++) {
        int width = arr[i]; // 保存开始位置作为初始高度
        for (int j=i+1; j<size; j++) {
            width = width<arr[j] ? width : arr[j]; // 遍历获取最小高度
            area = width * (j-i);
            if (area > max_area) {
                max_area = area;
            }
        }
    }
    printf("%d", max_area);
    return 0;
}

golang 题解:

package main

import (
	"fmt"
)

func main() {
	var a byte
	var tmp int
	var arr []int
	for {
		fmt.Scanf("%c", &a)
		if a >= '0' && a <= '9' {
			tmp = tmp*10 + (int)(a - '0')
		} else {
			arr = append(arr, tmp)
			tmp = 0
		}
		if a == '\n' {
			break;
		}
	}
	var area int
	max_area := 0
	length := len(arr)
	for i:= 0; i<length; i++ {
		width := arr[i]
		for j:=i+1; j<length; j++ {
			if width > arr[j] {
				width = arr[j]
			}
			area = width * (j-i)
			if max_area < area {
				max_area = area;
			}
		}
		
	}
	fmt.Println(max_area)
}

时间复杂度 O(n^2);

字符串 - 子串查找之kmp算法

题目

计算模板串S在文本串T中出现了多少次?

输入描述

由大小写字母组成的两组字符串,第一行为模板字符串,第二行为文本串,找出模板字符串在文本串出现的次数

输出描述

输出模板字符串在文本串出现的次数

示例

ababd
abababdb

思路

1、暴力法:拿模板字符串和文本串逐个比较,时间复杂度 O(m*n)
2、KMP算法:
参考链接:KMP算法详解

题解

KMP - C语言

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算模板串S在文本串T中出现了多少次
 * @param S string字符串 模板串
 * @param T string字符串 文本串
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int next_array(const char *patten, int *next)
{
    const int len = strlen(patten);
    int i;
    int j = -1;
    next[0] = j;
    for (i=1; i<len; i++) {
        while (j>-1 && patten[i] != patten[j+1]) { // 当匹配表中有匹配信息后
            j = next[j];
        }
        if (patten[i] == patten[j+1]) { //ababc // -1,-1,0,1,-1
            j++;
        }
        next[i] = j;
    }
    return 0;
}

int kmp(char* S, char* T ) {
    const int lens = strlen(S);
    const int lent = strlen(T);
    if (lens == 0 && lent == 0) {
        return 0;
    }
    if (lens == 0) {
        return 0;
    }
    int *next = (int*)malloc(sizeof(int)*lens);
    next_array(S, next);
    print_array(next, lens);
    int i, j=-1, cnt=0;
    for (i=0; i<lent; i++) {
        while (j>-1 && T[i] != S[j+1]) {
            j = next[j];
        }
        if (T[i] == S[j+1]) {
            j++;
        }
        if (j == lens-1) {
            cnt++;
        }
    }
    free(next);
    return cnt;
}


int main(void)
{ 
    char S[256];
    char T[256];
    scanf("%s%s", S, T);
    printf("%d\n", kmp(S, T));
}

纪念我的父亲(一)

  我的思绪常常飘到过去,飘到那个远离家乡的小村庄,那个父亲最后停留的地方。父亲大概也没有想到这辈子会那么短暂,而且最后的时间都在那个异乡度过。

  那是一个安静的村落,具有广东特点的许多特点,有一个传承下来又翻新过的祠堂,祠堂前面有一个水塘,祠堂到水塘中间都用水泥硬化了路面,从村子路过时祠堂显得宽阔又庄严。祠堂旁边无一例外的有两颗巨大的榕树,这种树的寿命往往显示着村庄的历史,越是古老的村庄,祠堂旁边的树年龄越大,这只是它的一个功能;它的另外一个功能是在夏天给村里提供一处纳凉休息的地方,树下面有几张斑驳的石桌,村里面的老人和小孩都喜欢在午后到这里乘凉嬉戏。

  但是父亲并没有居住在这个村子里,他是从外地过来这边做养殖的。在距离村子后面大约两三里地的地方,有三个池塘,一个比较大,另外两个比较小,它们位置的中间有两个小屋,青砖搭建的,一间用来放渔具和杂物的,另一件可能早期用来看鱼塘的吧,具体不得而知了;这间小屋由于建的比一般平房高一点,还又木板分了两层;占地面积大约五六个平方,地面一层放了一张一米五的竹板折叠床,一个电冰箱,一个自制的架子上面摆着一台电视;上面一层用木板架空,木板上面铺了彩棚布挡灰尘,紧接着用棉絮打底摆成一张床的形状,也可以住人,旁边摆了两个行李箱放衣服,又架了一根竹子挂着经常要穿的衣服;二楼距离地面两米多一点,中间用一个木头搭建的简易楼梯连接;为了能做饭,又在青砖房旁边搭建了一个棚子,周围用石棉瓦围住,就成了一个能挡雨遮风的厨房兼大厅,这个棚子比房子的占地面积还要大,整个建筑堆在一起看起来还是一间挺大的房子;房子前面有一块空地,空地连接着马路,房子左边不远处立了两扇铁门,将房子和马路隔开,这边就更像一块独立的院子了,父亲和母亲吃住就在这个院子里。

  再往里面就是养殖的地方了,有一排砖墙和沥青油毡顶的保温房,是冬天用来给鸭苗保温的;再过去一点在水里搭建了一个棚子。这种棚子是养殖专业棚,大多用竹子做支撑和结构,在和岸边平齐的地方构建平台,平台是延伸在水面的,上面用一排排竹子水平绑在支撑的架子上;平台的竹子上面平铺一层钢丝网,用铁丝把钢丝网固定在竹子上,这样鸭子就不会掉下去,人在上面也如履平地,鸭粪可以通过钢丝网漏到水塘里喂鱼,这个就是在生物课上说的生态养殖。棚子的四周都用钢丝网围着,在朝水塘方向的左右两边都开了个下水坡,用来给鸭子下到水塘里喝水和活动;当然下水的区域是用渔网围住的,不然鸭子都满水塘跑了。这个养殖棚大约两百个平方,一栏能养两千到三千鸭子。往上走还有两个水塘,一个水塘比较小,棚子也就比较小,只能养一千到两千只鸭子;另外一个水塘比较大,也能养两千到三千鸭子。父亲就是在这样一个村落里做养殖专业户。

  父亲在这边搞养殖,主营养殖番鸭。这种鸭子的名字我还闹了个笑话,因为大家平时都是说的家乡话,而湖南人发音“h”和“f”又不分,我一度以为这种鸭子叫“花鸭”,直到后面看到父亲的养殖书籍才知道这种鸭子叫番鸭。番鸭其实是海外引进的一种养殖肉鸭,故名“番”鸭;原产于中、南美洲热带地区,故主要养殖区域在我国南方;因为养殖出栏周期短,发育快,且肉质鲜美,有一定的消费市场,售价也比较一般鸭子高出不少,所以广东这边有大量的人员从事这块的养殖行业。父亲也养过别的品种的鸭子,但是都因为收益的问题而仅仅养了几批次;番鸭一直是首选品种,而且自己也爱吃。

  父亲早在二零零五年就开始从事养殖,刚开始养殖的地方并不在这里,而是在花都炭步。一般养殖棚三到五年就因为竹子结构的寿命问题报废,维修的成本和新建一个的成本差不多,而且由于鸭子的疫情关系,一旦养殖区域发生过鸭疫,那么后续的鸭子患上鸭疫的可能性更高,因此一般在一个区域养殖的时间不会太长。父亲在搬到这个地方之前,还待了几个别的地方,分别是花都横岗,赤坭,还有一个水库,最后才搬到这个叫司前白庙的地方,满打满算从事养殖有九年左右。