寒假学习每日总结D3

1.python学习

2.寒假基础算法题

3.数据库学习

1.python学习(函数,异常处理

一.函数:

二.处理异常:


2.寒假基础算法题

贪心算法:

目录

题目描述

题目一:

又是一年秋季时,陶陶家的苹果树结了 n个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。

这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在 s<0之前最多能摘到多少个苹果。

现在已知 n 个苹果到达地上的高度 xi​,椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 yi​,求陶陶最多能摘到多少个苹果。

输入格式

第 1 行:两个数 苹果数 n,力气 s。

第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。

第 3 行~第 3+n−1 行:每行两个数 苹果高度 xi​,摘这个苹果需要的力气 yi​。

输出格式

只有一个整数,表示陶陶最多能摘到的苹果数。

输入输出样例

输入 

8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2

输出 

4

算法思路:

(完全可以作为一个贪心算法的“模板”题)

根据需要定义一个有高度(hight)和所需要的力气(strength),高度用来筛选足以采摘的树的高度arr[i].hight<=H 满足条件,力气用来判断是否能继续采摘s>=arr[i].strength (因为力气不可能

为负值,所以可以省略 s>0 这串代码)

定义一个仿函数comp以所需要力气大小作为排序判断条件,!!!算法体现!!!(为了摘尽可能多的果子,则所需力气最少的为最优解)

题解代码;

​
#include<iostream>
#include <iomanip>
#include<algorithm>
using namespace std;
int n, s, a, b, H, sum ;

struct apple
{
    int hight;
    int strength;
};
apple arr[10001];

bool comp(apple a,apple b) {
        return a.strength < b.strength;//按力气从小到大排序
}

int main() {
    cin >> n >> s;
    cin >> a >> b;
    H = a + b;
    for (int i = 1; i <= n;i++) { //第一次写for (int i = 0; i < n;i++)竟然错了! 还是有一点点疑问 
        cin >> arr[i].hight>>arr[i].strength;
    }
    sort(arr+1,arr+n+1,comp);
    for (int i = 1; i <= n;i++) {
        if (s>=arr[i].strength&&arr[i].hight<=H) {
            sum++;
            s -= arr[i].strength;
        }
    }
    cout << sum;
    return 0;
}

​

题目二:

题目描述

小 A 有 n个糖果盒,第 i 个盒中有 ai​ 颗糖果。

小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 x,至少得吃掉几颗糖。

输入格式

输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 n 和给定的参数 x。

第二行有 nn 个用空格隔开的整数,第 i 个整数代表第 i盒糖的糖果个数 ai​。

输出格式

输出一行一个整数,代表最少要吃掉的糖果的数量。

输入输出样例

输入 

3 3
2 2 2

输出 

1

算法思路:

贪心算法可以理解为一种“短视”的算法,只关注“眼前的”,“最短”或“最小”...

若要要让任意两个相邻的盒子中糖的个数之和都不大于 x,

则可以从第一盒糖果开始,依次向后遍历,每两盒相邻糖果数之和最多为x颗,

第一盒糖果只与第二盒糖果相邻,而第二盒糖果与第一和第三盒糖果相邻,第三盒以此类推...

由此,如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量,所以我们要尽量吃掉第二个里的糖果,以此类推...

单独处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了

题解代码;

​
#include<iostream>
#include <iomanip>
using namespace std;

int arr[100001];

int main() {
    ios::sync_with_stdio(0);//关闭同步流加快速度
    int n, x, sum = 0;
    cin >> n >> x;
    cin >> arr[0];
    if (arr[0]>x) {//处理第一个单独超限
        sum += arr[0] - x;//增加吃的量
        arr[0] = x;//arr[i]>=x,要吃的最少,即是arr[i]=x
    }
    for (int i = 1; i < n; i++) {
        cin >> arr[i];
    }
    for (int j = 0; j < n - 1; j++) {//注意数组越界问题
        if (arr[j] + arr[j + 1] > x) {
            sum += arr[j] + arr[j + 1] - x;//相邻两盒糖果数最多为x颗
            arr[j + 1] = x - arr[j];//若相邻两盒相加>x,则只减后面一盒  (理解:公式变形---arr[j+1]+arr[j]==x)
        }
    }


    cout << sum;
    return 0;
}

​

3.数据库学习

1.Navicat 操作搜索

2.Navicat 操作函数

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值