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 操作函数