今天被头歌上面的python题难住了,一题写了两个半小时,也许是坤坤在发力吧...
笔记复习
1.利用sizeof确定数据类型的大小,即所占的字节
语法:
sizeof(变量名)
示例:
int arr [] = { 4,2,8,0,5,7,1,3,9 };
a=sizeof(arr)/sizeof(arr[0]);
//sizeof(arr)用于计算整个数组的大小,sizeof(arr[0])用于计算数组中第0个元素的大小
2.冒泡排序
a.比较相邻元素,如果第一个比第二个大,就交换他们两个
b.对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值
c.重复以上步骤,每次比较次数-1,直到不需要比较
如此操作之后元素将按升序排列
冒泡排序的原理与昨天数组中元素的逆置原理相同,区别在于多了两个关键点:
a.排序的轮数
b.排序的次数
分析:
可以发现,当数组元素个数为4时,我们需要比较3轮,其中第一轮比较3次,第二轮比较2次,第三轮比较1次。
这里可以得出一个结论:
冒泡排序中比较轮数==数组元素个数-1
每轮比较次数==数组元素个数-排序轮数-1 ps:这里的排序轮数指的是第一轮记为0,同数组元素的索引
示例:
#include<iostream>
using namespace std;
int main() {
int arr [] = { 4,2,8,0,5,7,1,3,9 };
cout << "排序前:" << endl;
for (int i = 0; i <= 8; i++) {
cout << arr[i];
}
cout << endl;
for (int k = 0; k < sizeof(arr)/sizeof(arr[0]) - 1; k++) {//利用这种形式表示数组元素个数更具有普遍性
for (int j = 0; j < 9 - k - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
cout << "排序后:" << endl;
for (int i = 0; i < 9; i++) {
cout << arr[i]<<" ";
}
cout << endl;
return 0;
}
3.二维数组
二维数组就是在一维数组的基础上多加一个维度,一维数组只有行,二维数组是行+列
二维数组的定义与一维数组类似,共有四种,如下:
#include<iostream>
using namespace std;
int main() {
//第一种
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
//-----------------------
//第二种
int arr2[2][3] = { {1,2,3},{4,5,6} };
//-----------------------
//第三种
int arr3[2][3] = { 1,2,3,4,5,6 };
//------------------------
//第四种(省略行数,由编译器计算行数)
int arr4[][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << arr4[i][j] << " ";
}
cout << endl;
}
return 0;
}
//一般在实操时使用第二种定义方式
输出二位数组中的每个元素可用for循环嵌套
4.二维数组数组名
与一维数组数组名相同,二维数组数组名也有两个用途:
a.查看二维数组所占内存空间
b.获取二维数组的首地址
#include<iostream>
using namespace std;
int main() {
int arr[2][3] = { {1,2,3},{1,2,3} };
//对于这个数组来说,1,2,3为第一行,1,1为第一列
cout << "二维数组第一行所占内存为:" << sizeof(arr[0]) << endl;
//使用arr[0]可以表示二维数组的第一行
//注:使用arr[][0]是无法表示数组的第一列的,要想输出数组的特定列,需要使用for循环,输出每一行的第n列元素
return 0;
}
二维数组应用案例:考试成绩统计
//二维数组应用案例:考试成绩统计
#include<iostream>
using namespace std;
int main() {
int arr[3][3] = { {100,100,100},{90,50,80},{60,70,80} };
string name[3] = { "张三","李四","王五" };
for (int i = 0; i <= 2; i++) {
int sum = 0;
for (int j = 0; j <= 2; j++) {
sum += arr[i][j];
cout << arr[i][j] << " ";
}
cout << name[i]<<"的总分为:"<<sum << endl;
}
return 0;
}
精选好题
1.题目
P 老师需要去商店买 nn 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 33 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 nn 支铅笔才够给小朋友们发礼物。
现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 nn 支铅笔最少需要花费多少钱。
输入格式
第一行包含一个正整数 nn,表示需要的铅笔数量。
接下来三行,每行用 22 个正整数描述一种包装的铅笔:其中第 11 个整数表示这种包装内铅笔的数量,第 22 个整数表示这种包装的价格。
保证所有的 77 个数都是不超过 1000010000 的正整数。
输出格式
1 个整数,表示 P 老师最少需要花费的钱。
输入输出样例
2.学到的点:
1.c++中整数的计算结果仍是整数,如果是小数则会向下取整
2.c++中小数类型的定义有两种,一种是float,一种是double,相比于float,double能够存储更多位小数,因此一般用double
3.cmath头文件
包含大量数学函数和常量如自然对数、圆周率,以及向下取整和向上取整计算
向上取整:
ceil(3 / 2)
向下取整:
floor(3/2)
ps:不使用math库也可以实现向上取整的操作,具体做法是用if函数比较结果和结果取整后的大小,如果结果比取整后的结果小,那么加1即可;如果相等则不需要操作;由于int转换将小数转化为整数是向下取整,因此不需要考虑结果比取整后的结果小的情况。
答案:
#include<iostream>
#include<cmath>
using namespace std;
int main() {
double arr[7];
for (int i = 0; i < 7; i++) {
cin >> arr[i];
}
int brr[3];
int a = ceil(arr[0] / arr[1]);
int b = ceil(arr[0] / arr[3]);
int c = ceil(arr[0] / arr[5]);
brr[0] = a * arr[2];
brr[1] = b * arr[4];
brr[2] = c * arr[6];
long long min = 1000000000;
for (int j = 0; j < 3; j++) {
if (min > brr[j]) {
min = brr[j];
}
}
cout << min << endl;
return 0;
}
标签:arr,int,第三天,---,二维,取整,数组,铅笔,日记
From: https://blog.csdn.net/wlyyywwq/article/details/143784024