acwing刷题指南3

//数组

 

AcWing 737. 数组替换

输入一个长度为 10 的整数数组 X[10],将里面的非正整数全部替换为1,输出替换完成后的数组。

输入格式

输入包含 10个整数,每个整数占一行。

输出格式

输出新数组中的所有元素,每个元素占一行。

输出格式为 X[i] = x,其中 i 为元素编号(从 0 开始),x 为元素的值。

输入样例:

10
-9
0
-4
-10
0
-2
-7
7
4

输出样例:

X[0] = 10
X[1] = 1
X[2] = 1
X[3] = 1
X[4] = 1
X[5] = 1
X[6] = 1
X[7] = 1
X[8] = 7
X[9] = 4

不用数组做法

#include<bits/stdc++.h>
using namespace std;
int main()
{
    for(int i = 0; i < 10; i ++ ){
        int x;  
        scanf("%d",&x);
        printf("X[%d] = %d\n", i, x <= 0 ? 1 : x);
    }
    return 0;
}

用数组做法

#include<bits/stdc++.h>
using namespace std;
int a[11];
int main()
{
    for(int i = 0;i < 10;i++) cin>>a[i];
    
    for(int i = 0;i < 10;i++)
        if(a[i] <= 0) a[i] = 1;//非负整数
        
        for(int i = 0;i<10;i++) printf("X[%d] = %d\n", i, a[i]);
    return 0;
}

//这里要注意数组下标从0开始,1的话不细心会出错

738. 数组填充

输入一个整数 V,输出一个长度为 10的数组N,数组中的第一个元素为 V,每个后续元素的值都为上一个元素的值的 2 倍。

例如,如果输入整数为 1,则数组为:1,2,4,8…

输入格式

输入一个整数 V。

输出格式

输出数组中的所有元素,每个元素占一行。

输出格式为 N[i] = x,其中 i 为元素编号(从 00 开始),x 为元素的值。

输入样例:

1

输出样例:

N[0] = 1
N[1] = 2
N[2] = 4
N[3] = 8
N[4] = 16
N[5] = 32
N[6] = 64
N[7] = 128
N[8] = 256
N[9] = 512

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a;
    cin>>a;
    for(int i = 0;i < 10;i++)
    {
        printf("N[%d] = %d\n",i,a);
        a = a*2;//注意这里一定要在输出之后再*2,要不然放在输出前会变成第一个值输出的是2

    }
    return 0;
}

739. 数组选择

输入一个长度为 100100 的数组 AA,请你按顺序输出其中不大于 1010 的所有元素。

输入格式

输入 100 个数,每个数占一行,表示数组的所有元素的值。

每个数可能是整数也可能是浮点数。

输出格式

按顺序输出数组中的所有不大于 10的元素,每个元素占一行。

输出格式为 A[i] = x,其中 i 为元素编号,x 为元素的值。

注意,所有的 x 均保留一位小数。

输入样例:

0
-5
63
-8.5
...

输出样例:

A[0] = 0.0
A[1] = -5.0
A[3] = -8.5
...

#include<bits/stdc++.h>
using namespace std;
double a[150];
int main()
{
    for(int i = 0;i < 100;i++) scanf("%lf",&a[i]);
    
    for(int i = 0;i < 100;i++)
    {
        if(a[i] <= 10) printf("A[%d] = %.1lf\n",i,a[i]);
    }
    return 0;
}

743. 数组中的行

思路:一看就知道是遍历二维数组,符合要求即可操作

输入一个二维数组 M[12][12],根据输入的要求,求出二维数组中某一行的元素的平均值或元素的和。

输入格式

第一行输入整数L,表示所求的具体行数(行数从 0 开始计数)。

第二行包含一个大写字母,若为 S,则表示需要求出第 L 行的元素的和,若为 M,则表示需要求出第 L行的元素的平均值。

接下来 12 行,每行包含 1212 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。

输出格式

输出一个数,表示所求的平均数或元素的和的值,保留一位小数。

输入样例:

7
S
8.3 -9.4 -5.6 9.9 2.2 3.2 6.9 7.7 -2.9 -6.3 3.9 -1.4
-0.5 4.3 -0.3 2.3 0.7 -3.1 -6.3 5.7 -7.7 -3.7 9.7 3.8
5.8 -9.1 3.5 7.0 2.5 -2.3 6.9 2.7 5.8 -4.6 -7.8 4.3
-1.7 -8.9 -2.6 7.5 -9.6 6.4 -4.7 -8.0 0.6 6.7 -1.8 -0.4
-9.8 8.9 -3.8 -2.1 5.8 -9.4 1.3 6.3 -1.3 -6.3 -6.6 8.8
-6.3 -7.2 -6.3 -5.9 6.2 9.3 2.0 -4.3 2.7 3.6 -4.6 8.7
3.8 7.4 8.7 -2.8 6.0 -9.2 1.9 3.1 -7.2 -6.0 9.7 -8.4
-9.8 6.6 8.6 2.3 1.1 -2.9 6.6 -1.5 2.1 -5.1 6.4 -7.5
-0.6 -1.6 9.5 -6.6 3.0 3.4 -7.5 -7.9 3.1 2.0 1.7 -7.6
-9.0 9.4 6.6 -0.2 1.4 6.5 8.6 2.0 -1.3 0.2 4.0 -2.4
-7.3 -6.3 -8.6 -7.5 8.5 1.4 -3.3 7.1 0.8 3.3 3.0 0.1
3.3 9.0 1.7 5.2 -3.7 8.9 3.8 -7.4 -2.8 0.6 -2.4 7.1

输出样例:

6.9

#include<bits/stdc++.h>
using namespace std;
const int N = 13;
double M[N][N];
int main()
{
    int l;
    char n;
    cin>>l>>n;
    
    for(int i = 0;i<12;i++)
        for(int j = 0;j<12;j++)
            cin>>M[i][j];
    double sum;
    for(int i = 0;i < 12;i++)
    sum += M[l][i];
    if(n == 'S') printf("%.1lf",sum); //注意这里是大写的op的判断值(也就是S,不是s)
   else printf("%.1lf",sum/12.0);
    return 0;
}

745. 数组的右上半部分

输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的右上半部分元素的平均值或元素的和。

右上半部分是指主对角线上方的部分,如下图所示,黄色部分为对角线,绿色部分为右上半部分:

 

输入格式

第一行输入一个大写字母,若为 S,则表示需要求出右上半部分的元素的和,若为 M,则表示需要求出右上半部分的元素的平均值。

接下来 12行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。

输出格式

输出一个数,表示所求的平均数或元素的和的值,保留一位小数。

输入样例:

M
-6.5 8.2 0.7 9.0 0.8 -4.3 0.9 -0.0 -7.9 7.1 -1.6 4.6
-9.4 -9.0 1.5 -9.0 -5.1 -0.5 -2.8 -9.1 8.0 -6.9 -5.5 -6.6
-6.8 0.3 3.8 6.1 -9.9 -9.3 8.5 8.6 5.0 6.9 -3.6 -3.0
-0.8 -1.6 -7.3 -6.7 4.4 -9.1 -9.0 1.6 0.3 -6.0 6.0 -0.8
-0.8 -6.0 -4.9 -3.9 6.4 6.2 -4.2 -0.9 7.9 1.6 -8.2 -9.2
7.8 -5.8 -5.8 -5.8 7.2 0.5 -7.9 1.2 -6.8 -9.1 0.3 -1.4
4.3 -7.2 3.5 -6.4 -9.1 -6.0 3.5 -5.1 -5.6 -6.9 -9.1 -2.1
-7.6 -7.1 0.7 -1.7 5.0 -9.0 1.4 -6.2 7.6 4.8 -7.5 4.0
-0.2 0.3 -4.2 8.4 0.7 -6.4 -2.7 3.5 -0.9 3.7 0.9 -2.7
7.1 0.1 8.4 -5.1 -7.9 -0.5 -5.3 -5.7 -4.6 9.6 -8.3 7.0
9.6 -9.8 3.3 -9.9 -6.8 6.7 3.1 1.2 -9.5 -4.3 -1.7 -9.7
1.8 5.0 8.3 -0.7 -0.9 3.2 2.5 0.5 7.3 8.3 0.3 0.9

输出样例:

-1.2

 #include<bits/stdc++.h>
using namespace std;
const int N = 13;
double M[N][N];//注意这里是double,是int 的话就是0.0
int main()
{
    char n;
    cin>>n;
    double sum = 0;
    
    for(int i = 0;i < 12;i++)//i控制行
    for(int j = 0;j < 12;j++)//j控制列
    {
        cin>>M[i][j];
        if(i < j)
        sum += M[i][j];
    }
    if(n == 'S') printf("%.1f",sum);
    else printf("%.1f",sum/66.0);//(11+1)*11/2=66
    return 0;
}

749. 数组的上方区域

输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的上方区域元素的平均值或元素的和。

数组的两条对角线将数组分为了上下左右四个部分,如下图所示,黄色部分为对角线,绿色部分为上方区域:

输入格式

第一行输入一个大写字母,若为 S,则表示需要求出上方区域的元素的和,若为 M,则表示需要求出上方区域的元素的平均值。

接下来 12 行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。

输出格式

输出一个数,表示所求的平均数或和的值,保留一位小数。

输出结果与标准答案据对误差不超过 0.1 即视为正确。

输入样例:

S
-4.8 -8.0 -2.9 6.7 -7.0 2.6 6.5 1.7 1.9 5.6 -1.6 -6.3
-4.3 1.5 8.7 -0.3 5.4 -9.3 4.8 7.0 3.6 -8.3 -1.0 1.3
-9.9 9.7 -6.3 5.8 2.9 2.9 -7.7 4.9 -0.6 7.2 6.4 7.7
2.8 -5.8 -0.0 2.2 4.0 7.7 -3.0 -7.5 -3.5 9.7 -4.3 -8.6
-1.8 -0.1 5.4 0.6 9.9 -3.7 -1.1 0.8 -0.2 -0.0 9.9 4.5
3.0 -3.9 2.1 -9.7 5.5 9.4 -4.6 3.3 -9.6 5.1 -4.5 1.5
4.3 -5.4 -7.9 9.2 -7.7 -9.6 -1.5 -1.6 -7.2 2.0 -3.7 -0.7
8.0 2.8 -4.1 7.1 8.4 -5.6 3.9 -9.7 -1.1 3.0 -8.5 -3.3
1.7 5.1 0.1 9.2 4.5 9.7 7.2 8.6 8.7 1.1 6.7 0.3
-3.6 -7.1 -8.9 7.1 -5.9 1.6 -7.4 6.7 3.9 4.3 -2.4 -3.7
8.9 -6.2 5.0 -8.6 -1.3 -8.8 2.6 8.9 5.5 9.0 -2.2 -4.4
5.7 3.7 1.8 -2.1 -7.3 -7.9 4.7 6.0 3.3 -2.8 1.4 -6.9

输出样例:

21.7

 思路:用草稿纸模拟一遍数值对于这题来说,我们只需要i模拟到第五行,然后分别列出左边和右边发现规律

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char op;
    double sum = 0,M[12][12];
    int count = 0;
    cin>>op;
    
    for(int i = 0;i < 12;i++)
    for(int j = 0;j < 12;j++)
    cin>>M[i][j];
    
    for(int i = 0;i < 5;i++)
    for(int j = i+1;j <= 10-i;j++)
    {
        count++;
        sum += M[i][j];
    }
    if(op == 'S')printf("%.1f",sum);
    else printf("%.1f",sum/count);
    return 0;
}

751. 数组的左方区域 

输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的左方区域元素的平均值或元素的和。

数组的两条对角线将数组分为了上下左右四个部分,如下图所示,黄色部分为对角线,绿色部分为左方区域:

输入格式

第一行输入一个大写字母,若为 S,则表示需要求出左方区域的元素的和,若为 M,则表示需要求出左方区域的元素的平均值。

接下来 12 行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。

输出格式

输出一个数,表示所求的平均数或和的值,保留一位小数。

输入样例:

S
4.7 -3.3 -2.3 4.5 -7.0 8.7 -4.1 -3.0 -7.6 6.3 -6.6 -4.7
-7.2 9.3 -7.6 9.1 9.2 9.0 5.5 -7.5 -9.3 -1.6 -3.5 -4.2
0.5 -7.5 -8.3 -9.0 -6.4 3.8 0.1 -3.5 7.9 2.1 2.4 -6.2
7.0 5.7 -9.0 -5.8 1.6 2.6 -9.2 -6.2 4.6 8.2 -8.3 -1.4
3.8 -9.9 6.2 -2.5 -3.5 9.4 1.6 7.0 3.3 -0.5 6.7 6.0
1.6 -3.8 5.0 8.8 4.2 7.7 0.7 7.4 7.9 -5.9 4.4 3.3
3.7 6.2 6.7 -1.4 6.1 -6.0 8.5 9.1 5.7 -4.2 5.9 -3.5
5.0 0.3 2.2 -3.6 6.3 -10.0 9.5 -4.7 2.7 8.1 7.5 -8.4
-5.7 -0.3 -3.7 -3.3 7.7 9.3 -1.3 1.0 0.3 1.9 9.9 9.0
-7.4 1.3 -9.6 -3.6 2.2 3.4 -3.6 3.5 8.3 0.5 9.7 -6.8
1.0 -2.7 -1.5 5.4 -6.5 -3.7 5.6 8.0 -9.9 0.1 2.2 7.6
5.6 4.3 1.5 -0.8 5.8 -5.1 5.5 6.2 -5.8 8.8 -0.6 -2.3

输出样例:

13.3

 这题看图说话吧

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char op;
    cin>>op;
    int count = 0;
    double sum = 0,M[12][12];
    for(int i = 0;i < 12;i++)
    for(int j = 0;j < 12;j++)
    cin>>M[i][j];
    //上半部分
    for(int i = 1;i <= 5;i++)
    for(int j = 0;j <= i-1;j++)
    {
        count++;
        sum += M[i][j];
    }
    //下半部分
    for(int i = 6;i<=10;i++)
    for(int j = 0;j<=10-i;j++)
    {
        count++;
        sum += M[i][j]; 
    }
    if(op == 'S')printf("%.1lf\n",sum);
    else printf("%.1lf\n",sum/count);
    return 0;

753. 平方矩阵 I

输入整数 N,输出一个 N阶的回字形二维数组。

数组的最外层为 1,次外层为 2,以此类推。

输入格式

输入包含多行,每行包含一个整数 N。

当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。

输出格式

对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。

每个数组占 N行,每行包含 N 个用空格隔开的整数。

每个数组输出完毕后,输出一个空行。

输入样例:

1
2
3
4
5
0

输出样例:

1

1 1
1 1

1 1 1
1 2 1
1 1 1

1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

思路:以5阶为例,从1开始 i,j为两层循环的索引,这里取值为min(i,j)时,输出如下,可以看出数值沿主对角线从小到大递增。

1 1 1 1 1 
1 2 2 2 2 
1 2 3 3 3 
1 2 3 4 4 
1 2 3 4 5 
取值为min(n-i+1, n-j+1)时,输出如下,可以看出数值沿主对角线从大到小递减。

5 4 3 2 1 
4 4 3 2 1 
3 3 3 2 1 
2 2 2 2 1 
1 1 1 1 1 
对于本题目,输出的取值为min(min(i,j), min(n-i+1, n-j+1)),即重叠以上两个方阵,我们总取其中较小的值,输出如下。

1 1 1 1 1 
1 2 2 2 1 
1 2 3 2 1 
1 2 2 2 1 
1 1 1 1 1 

#include <iostream>

using namespace std;

int main(){
    int n;
    while(cin >> n, n){
        int m[n][n];
        int t=0,i,j;
        for(t=1; t<=(n+1)/2; t++)

{         //元素的值为t
            for(i=t-1; i<n-t+1; i++)

{      //第i行第j列的元素为t
                for(j=t-1; j<n-t+1; j++)

{
                    m[i][j] = t;
                }
            }
        }

        for(int i=0; i<n; i++){           //输出
            for(int j=0; j<n; j++){
                cout << m[i][j] << ' ';
            }
            cout << endl;
        }
        cout << endl;
    }

    return 0;
}

AcWing 742. 最小数和它的位置

输入一个整数 N 和一个长度为 N 的整数数组 X。

请你找到数组中最小的元素,并输出它的值和下标。

注意,如果有多个最小值,则返回下标最小的那个。

输入格式

第一行包含整数 N。

第二行包含 N 个用空格隔开的整数 X[i]。

输出格式

第一行输出 Minimum value: x,其中 x 为数组元素最小值。

第二行输出 Position: y,其中 y为最小值元素的下标(下标从0 开始计数)。

输入样例:

10
1 2 3 4 -5 6 7 8 9 10

输出样例:

Minimum value: -5
Position: 4

#include<bits/stdc++.h>
using namespace std;
const int N = 1001;
int s[N];
int main()
{
    int n; 
    cin>>n;
    for(int i = 0;i < n;i++)//最好从0开始
    {
        cin>>s[i];
    }
    int ans = s[0],cnt = 0;
    for(int i = 1;i<=n;i++)
    {
        if(s[i]<ans)
        {
            ans = s[i];
            cnt = i;
        }
    }
    cout<<ans<<endl;
    cout<<cnt<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值