2021-01-09

编程学习历程

一、在这里插入图片描述
栈区的特点
(1)由系统按栈规则管理,先定义的变量在高址;
(2)编译时就已经“规划”好了,运行时才使用,不存在分配失败之虞;
(3)函数调用时诞生,函数结束时消亡,分配和释放是自动的;
(4)用户无法干预变量的诞生和消亡,其寿命短暂。
(5)栈区变量分配是按先高址后低址的次序分配的。

1.在运行程序出现错误 编译器提示stack overflow时,其意思为栈溢出
2.栈区随函数的结束而释放

静态区的特点
(1)编译时已确定并在加载时初始化,不存在分配失败之虞;
(2)程序运行时诞生,程序结束时消亡;
寿命较长;
(3)分配次序是先定义的变量在低址,后定义的在高址;
(4)局部静态变量仍受“局部作用域”节制。

对于静态区的变量,在运行前已被初始化,而且初始化只做一次。

ex:
#include<stdio.h>
int Func(void)
{
static int i=2;
return ++i;
}
void main(void)
{
int i;
i=Func();
i=Func();
printf("%d\n",i");
}
最后输出结果为4
二、贪心算法案例
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
关键是贪心策略的选择,而贪心算法与动态规划的主要区别是:
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。即贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。
所以,贪心算法的正确性可以通过数学归纳法或贪心交换来给予证明。

ex:阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N≤100) 堆金币,第 i 堆金币的总重量和总价值分别是 mi,vi。阿里巴巴有一个承重量为 T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?

输入格式
第一行两个整数 N,T。

接下来 N 行,每行两个整数 mi,vi 。

输出格式

一个实数表示答案,输出两位小数

想法:开始刚看到题目,认为是背包问题,但是在做的过程中,发现用贪心也可以解决,用贪心做了一遍后,发现输出不正确,看了题解后才发现,原来还有性价比之说,金币还能进行分割,然后用结构体加贪心做了一遍
代码如下:
#include <stdio.h>
#include
using namespace std;

struct nobe {
double w;
double v;
double p;
} a[105];
int n;
double sum, c;

int main() {
double temp;
cin >> n >> c;
for (int i = 1; i <= n; i++) {
cin >> a[i].w >> a[i].v;
a[i].p = a[i].v / a[i].w;
}
for (int i = 1; i <= n; i++) {
if (a[i].p < a[i + 1].p) {
temp = a[i].p;
a[i].p = a[i + 1].p;
a[i + 1].p = temp;
}
}
for (int i = 1; i <= n; i++) {
if (c >= a[i].w) {
c -= a[i].w;
sum += a[i].v;
} else {
sum += c * a[i].p;
break;
}
}
printf("%.2f", sum);
return 0;
}

三、本来也是贪心算法案例,可是做着做着就成了冒泡排序
题目描述
有 n个人在一个水龙头前排队接水,假如每个人接水的时间为 T,请编程找出这 n 个人排队的一种顺序,使得 n个人的平均等待时间最小。

输入格式
第一行为一个整数 n。第二行 n 个整数,第 i 个整数 Ti 表示第 i 个人的等待时间 Ti

输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

想法:开始就想到了冒泡,然后就直接冒泡了,先定义了一个结构体,难住我的地方是最后算n个人的平均等待时间最小,一开始没反应过来,直接sum/n了事,发现结果不对,仔细读题后才发现理解错误,代码加粗部分为正确解法。

代码如下:
#include <stdio.h>
#include
using namespace std;

struct node {
int n;
int t;
} a[1100], temp;

int main() {
int n;
double sum = 0, k;
cin >> n;
for (int i = 1; i <= n; i++) {
a[i].n = i;
cin >> a[i].t;
}
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n - 1; j++) {
if (a[i].t > a[j + 1].t ) {
temp = a[i];
a[i] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 1; i <= n; i++) {
printf("%d ", a[i].n );
}
printf("\n");
for (int i = 1; i <= n; i++)
sum += i * a[n - i].t;
sum /= n;
printf("%.2f", sum);

return 0;
}

今天的蒟蒻又有了一丝丝的进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值