数字统计

第五单元 - 图1

P2550 [AHOI2001] 彩票摇奖

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. /*
  5. 2
  6. 23 31 1 14 19 17 18
  7. 12 8 9 23 1 16 7
  8. 11 7 10 21 2 9 31
  9. */
  10. int n, ac_num[7] ={0}, zj_num[7] = {0};
  11. cin >> n;
  12. // 读入中奖号码
  13. for(int i = 0 ;i <7 ; i++){
  14. cin >> ac_num[i];
  15. }
  16. // 兑奖 ,假设只买了一张
  17. for(int m = 0; m < n ; m++){
  18. int cnt = 0;
  19. for(int j = 0; j < 7; j ++ ){
  20. int x;
  21. cin >> x; // 12
  22. for( int k = 0; k < 7 ; k++){
  23. if(x == ac_num[k]){
  24. // 该数字为中奖号码。
  25. cnt ++;
  26. }
  27. }
  28. }
  29. // 保存当前这张彩票的中奖情况
  30. zj_num[cnt] ++;
  31. }
  32. cout << zj_num[6] << " ";
  33. for(int i = 7-1; i >=1 ; i--){
  34. cout << zj_num[i] << " ";
  35. }
  36. return 0;
  37. }

旗鼓相当的对手

我们可以定义四个数组,分别代表语,数,外,总分,然后统计即可。

注意统计的时候要用双重循环,因为每一个学生都要和其他所有学生比较。

代码(一维数组解法):

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int chi[1005],mat[1005],eng[1005],tot[1005];
  4. int ans=0;
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=1;i<=n;++i){
  9. cin>>chi[i]>>mat[i]>>eng[i];
  10. tot[i]=chi[i]+mat[i]+eng[i]; //计算总分
  11. }
  12. for(int i=1;i<=n;i++){
  13. //不要计算自己,和其他同学比
  14. for(int j=i+1;j<=n;j++){
  15. if((abs(chi[i]-chi[j])<=5)&&(abs(mat[i]-mat[j])<=5)&&(abs(eng[i]-eng[j])<=5)&&(abs(tot[i]-tot[j])<=10))ans++;//一个一个判断
  16. }
  17. }
  18. cout<<ans;
  19. return 0;
  20. }

扩展: 桶排序

U230565 桶排序 https://www.luogu.com.cn/problem/U230565

第五单元 - 图2

杨辉三角:

10大神秘特性

10大神秘特性
  1. #include <stdio.h>
  2. #define N 14
  3. void main()
  4. {
  5. int i, j, k, n=0, a[N][N]; /*定义二维数组a[14][14]*/
  6. while(n<=0||n>=13){ /*控制打印的行数不要太大,过大会造成显示不规范*/
  7. printf("请输入要打印的行数:");
  8. scanf("%d",&n);
  9. }
  10. printf("%d行杨辉三角如下:\n",n);
  11. for(i=1;i<=n;i++)
  12. a[i][1] = a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/
  13. for(i=3;i<=n;i++)
  14. for(j=2;j<=i-1;j++)
  15. a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/
  16. for(i=1;i<=n;i++){
  17. for(k=1;k<=n-i;k++)
  18. printf(" "); /*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/
  19. for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/
  20. printf("%6d",a[i][j]);
  21. printf("\n"); /*当一行输出完以后换行继续下一行的输出*/
  22. }
  23. printf("\n");
  24. }

c++ 实现

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int n ; // < 13
  5. cin >> n ;
  6. int arr[14][14] = {0};
  7. for(int i = 1;i<=n; i++){
  8. arr[i][1] = 1;
  9. arr[i][i] = 1;
  10. }
  11. for(int i = 3; i <= n; i++){
  12. for(int j = 2; j <= i-1;j++){
  13. arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
  14. }
  15. }
  16. for(int i = 1; i <= n; i++){
  17. for(int j = 1; j <= i;j++){
  18. cout << arr[i][j] << " ";
  19. }
  20. cout << endl;
  21. }
  22. }

习题 5.1 梦中的统计(洛谷 P1554)

Bessie 正在数数,她从 M 数到 N,请统计 M 到 N 中每个数码 出现了几次? 例如 111 中 1 出现了 3 次,2-9 和 0 都出现了 0 次。 提示:可定义 a 数组,a[0] 表示0出现的次数,a[1] 表示 1 出现 的次数…以此类推。分离每一个数字,得到一个数字就在相应的 a 数组上 +1。 这题依然需要初始化 a 数组。 第五单元 - 图3

习题 5.2 珠心算测验(洛谷 P2141 NOIP2014)

给出n(n<=100)个不超过 10000 互不相同的正整数,求这些数 字中有多少个数恰好等于另外两个不同的数之和。 例如下面的例子,3=1+2,4=1+3,所以这两个数符合要求 提示:使用三重循环,第一重枚举判断各个数字,第二重和第三 重枚举剩下两个数字。这三个数字不能在相同的位置。 输入:

  1. 4
  2. 1 2 3 4

输出

  1. 2

标记 book[ a[i] + a[j] ] 的和为数组下标,统计过滤 第五单元 - 图4

习题 5.3 爱与愁的心痛(洛谷 P1614)

第五单元 - 图5

第五单元 - 图6

习题 5.6 蛇形方阵(洛谷 P5731)

题目描述

给出一个不大于 $9$ 的正整数 $n$,输出 $n\times n$ 的蛇形方阵。

从左上角填上 $1$ 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 $3$ 个字符,前面使用空格补齐。

输入格式

输入一个正整数 $n$,含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

样例 #1

样例输入 #1

  1. 4

样例输出 #1

  1. 1 2 3 4
  2. 12 13 14 5
  3. 11 16 15 6
  4. 10 9 8 7

提示

数据保证,$ 1 \leq n \leq 9 $。

方向数组

方向数组

我理解的方向数组,与坐标有关系,直接看个图:

例如 第五单元 - 图7

你可以这样定义:
模板如下:

  1. int map[4][2]={{-1,0},{1,0},{0,1},{0,-1}}//左 右 上 下
  2. fx=x;fy=y;//x y表当前坐标
  3. for(int i=0;i<4;i++){
  4. fx=x+map[i][0];
  5. fy=y+map[i][1];//四个方向遍历
  6. ......
  7. }1234567
  1. /*其实 map[4][2]可以拆分为:
  2. map[0][0]=-1;
  3. map[0][1]=0;
  4. map[1][0]=1;
  5. map[1][1]=0;
  6. map[2][0]=0;
  7. map[2][1]=1;
  8. map[3][0]=0;
  9. map[3][1]=-1;
  10. 这样就比较容易理解了~*/12345678910

也可以定义八个方向的:
第五单元 - 图8 模板如下:

  1. int spx[] = {0,1,0,-1,1,1,-1,-1};
  2. int spy[] = {1,0,-1,0,-1,1,1,-1};
  3. for(int i = 0;i <8 ;++i){//左上左下右上右下还包括相邻的
  4. int nx = x+ spx[i];
  5. int ny = y +spy[i];
  6. ......
  7. }

或者

  1. int xy[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}};
  2. for(int i=0;i<8;i++){
  3. int nx=x+xy[i][0];
  4. int ny=y+xy[i][1];
  5. .....
  6. }