数字统计
P2550 [AHOI2001] 彩票摇奖
#include <iostream>
using namespace std;
int main(){
/*
2
23 31 1 14 19 17 18
12 8 9 23 1 16 7
11 7 10 21 2 9 31
*/
int n, ac_num[7] ={0}, zj_num[7] = {0};
cin >> n;
// 读入中奖号码
for(int i = 0 ;i <7 ; i++){
cin >> ac_num[i];
}
// 兑奖 ,假设只买了一张
for(int m = 0; m < n ; m++){
int cnt = 0;
for(int j = 0; j < 7; j ++ ){
int x;
cin >> x; // 12
for( int k = 0; k < 7 ; k++){
if(x == ac_num[k]){
// 该数字为中奖号码。
cnt ++;
}
}
}
// 保存当前这张彩票的中奖情况
zj_num[cnt] ++;
}
cout << zj_num[6] << " ";
for(int i = 7-1; i >=1 ; i--){
cout << zj_num[i] << " ";
}
return 0;
}
旗鼓相当的对手
我们可以定义四个数组,分别代表语,数,外,总分,然后统计即可。
注意统计的时候要用双重循环,因为每一个学生都要和其他所有学生比较。
代码(一维数组解法):
#include<bits/stdc++.h>
using namespace std;
int chi[1005],mat[1005],eng[1005],tot[1005];
int ans=0;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>chi[i]>>mat[i]>>eng[i];
tot[i]=chi[i]+mat[i]+eng[i]; //计算总分
}
for(int i=1;i<=n;i++){
//不要计算自己,和其他同学比
for(int j=i+1;j<=n;j++){
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++;//一个一个判断
}
}
cout<<ans;
return 0;
}
扩展: 桶排序
U230565 桶排序 https://www.luogu.com.cn/problem/U230565
杨辉三角:
10大神秘特性
#include <stdio.h>
#define N 14
void main()
{
int i, j, k, n=0, a[N][N]; /*定义二维数组a[14][14]*/
while(n<=0||n>=13){ /*控制打印的行数不要太大,过大会造成显示不规范*/
printf("请输入要打印的行数:");
scanf("%d",&n);
}
printf("%d行杨辉三角如下:\n",n);
for(i=1;i<=n;i++)
a[i][1] = a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/
for(i=3;i<=n;i++)
for(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++)
printf(" "); /*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/
for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/
printf("%6d",a[i][j]);
printf("\n"); /*当一行输出完以后换行继续下一行的输出*/
}
printf("\n");
}
c++ 实现
#include <iostream>
using namespace std;
int main(){
int n ; // < 13
cin >> n ;
int arr[14][14] = {0};
for(int i = 1;i<=n; i++){
arr[i][1] = 1;
arr[i][i] = 1;
}
for(int i = 3; i <= n; i++){
for(int j = 2; j <= i-1;j++){
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i;j++){
cout << arr[i][j] << " ";
}
cout << endl;
}
}
习题 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 数组。
习题 5.2 珠心算测验(洛谷 P2141 NOIP2014)
给出n(n<=100)个不超过 10000 互不相同的正整数,求这些数 字中有多少个数恰好等于另外两个不同的数之和。 例如下面的例子,3=1+2,4=1+3,所以这两个数符合要求 提示:使用三重循环,第一重枚举判断各个数字,第二重和第三 重枚举剩下两个数字。这三个数字不能在相同的位置。 输入:
4
1 2 3 4
输出
2
标记 book[ a[i] + a[j] ] 的和为数组下标,统计过滤
习题 5.3 爱与愁的心痛(洛谷 P1614)
习题 5.6 蛇形方阵(洛谷 P5731)
题目描述
给出一个不大于 $9$ 的正整数 $n$,输出 $n\times n$ 的蛇形方阵。
从左上角填上 $1$ 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 $3$ 个字符,前面使用空格补齐。
输入格式
输入一个正整数 $n$,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例 #1
样例输入 #1
4
样例输出 #1
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
提示
数据保证,$ 1 \leq n \leq 9 $。
方向数组
方向数组
我理解的方向数组,与坐标有关系,直接看个图:
例如
你可以这样定义:
模板如下:
int map[4][2]={{-1,0},{1,0},{0,1},{0,-1}}//左 右 上 下
fx=x;fy=y;//x y表当前坐标
for(int i=0;i<4;i++){
fx=x+map[i][0];
fy=y+map[i][1];//四个方向遍历
......
}1234567
/*其实 map[4][2]可以拆分为:
map[0][0]=-1;
map[0][1]=0;
map[1][0]=1;
map[1][1]=0;
map[2][0]=0;
map[2][1]=1;
map[3][0]=0;
map[3][1]=-1;
这样就比较容易理解了~*/12345678910
也可以定义八个方向的:
模板如下:
int spx[] = {0,1,0,-1,1,1,-1,-1};
int spy[] = {1,0,-1,0,-1,1,1,-1};
for(int i = 0;i <8 ;++i){//左上左下右上右下还包括相邻的
int nx = x+ spx[i];
int ny = y +spy[i];
......
}
或者
int xy[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}};
for(int i=0;i<8;i++){
int nx=x+xy[i][0];
int ny=y+xy[i][1];
.....
}