【CSDN】每日一练(19)

目录

第一题

醉酒的狱卒

题目描述

输入描述:

输出描述:

输入样例

输出样例

题解

第二题

小股炒股

题目描述

输入描述:

输出描述:

输入样例

输出样例

题解

第三题

矩阵问题

题目描述

输入样例

输出样例

题解

第四题

好数对

题目描述

题解


下面我将介绍一下我写的每日一练的答案。

第一题

醉酒的狱卒

题目描述

某监狱有一个由n个牢房组成的大厅,每个牢房紧挨着。每个牢房里都有一个囚犯,每个牢房都是锁着的。 一天晚上,狱卒感到无聊,决定玩一个游戏。在第一轮,他喝了一杯威士忌,然后跑下大厅,打开每个牢房的锁。在第二轮比赛中,他喝了一杯威士忌,然后跑下大厅,锁上每隔一个的牢房的锁(牢房2、4、6....)。在第三轮比赛中,他喝了一杯威士忌,然后跑下大厅。他每隔三个牢房(第3、6、9号牢房)就去一次。如果牢房被锁上了,他就把它打开;如果牢房门打开了,他就锁上牢房。他重复n轮,喝最后一杯,然后昏倒。 一些囚犯(可能为零号)意识到他们的牢房被解锁且狱卒丧失了行动能力。他们就可以立即逃跑。现在根据牢房数量,确定有多少囚犯越狱。

输入描述:

第一行输入包含一个正整数t。表示有t行数据,下面每一行都包含一个介于5和100之间(含5和100)的整数,即轮数n

输出描述:

对于每一行,必须打印出监狱有n个牢房时越狱的囚犯人数

输入样例

2
5
100

输出样例

2
10

题解

#include<iostream>
using namespace std;
int n,cnt=0;
int main()
{
	int x=0;
	cin>>x;
	while(x--)
    {
    cin>>n;
    if(n>=4) cnt=2;
	else cnt=1; 
    for(int i=6;i<=n;i++)
    {
    	int ans=0;
       for(int j=2;j<=n;j++)
       {
       	if(i%j==0) ans++;
	   }
       if(ans%2==0) cnt++;
	}
	cout<<cnt<<endl;
	}
	return 0;
}

第二题

小股炒股

题目描述

已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益是?

输入描述:

第一行输入整数n,m。(1<=n<=1000,1<=m<=10000) 第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)

输出描述:

输出小最大收益

输入样例

2 4
3 7

输出样例

8

题解

#include <iostream>
#include <string>
#include<bits/stdc++.h>
using namespace std; 
int solution(int n,int m,vector<int>& vec){
    int result;
    result=m;
    for(int i=0;i<n;++i){
        for(int j=i+1;j<n;++j){
            int x=m/vec[i];
            result=max(result,m-x*vec[i]+x*vec[j]);
        }
    }
    return result;
}
 
int main() {
 
    int n;
    int m;
    vector<int> vec;
    cin>>n;
    cin>>m; 
    string line_0, token_0;
    getline(cin >>ws,line_0);
    stringstream tokens_0(line_0);
    while(getline(tokens_0, token_0, ' ')){
        vec.push_back(stoi(token_0));
    }
    int result = solution(n, m,vec);
    cout<<result<<endl;
    return 0;
}

这道题主要考验对二维数组的理解。

第三题

矩阵问题

题目描述

编写以下函数:

(1)在一个二维数组中形成以下形式的n阶矩阵:

 [1 1 1 1 1
 2 1 1 1 1
 3 2 1 1 1
 4 3 2 1 1
 5 4 3 2 1]
 ```

(2)去掉靠边的元素,生成新的n-2阶矩阵;

(3)求生成的n阶矩阵主对角线上的元素之和;

(4)以方阵形式输出数组。

在main函数中调用以上函数进行测试。

**输入**

输入生成矩阵的阶数(n>=2)

**输出**

以方阵形式输出生成的n阶矩阵、去掉靠边的元素生成的新的n-2阶矩阵、以及生成的n阶矩阵主对角线上的元素之和,最后一行要回车

输入样例

```json
5

输出样例

Generated matrix:

1 1 1 1 1
2 1 1 1 1
3 2 1 1 1
4 3 2 1 1
5 4 3 2 1

del the elements on the side:

1 1 1
2 1 1
3 2 1

The sum of the diagonal:5

题解

#include <iostream>
using namespace std;
int main()
{
    while (1)
    {
        int a;
        cin >> a;
        int array[a][a];
        for (int i = 0; i < a; i++)
            for (int j = 0; j < a; j++)
            {
                if (j < i)
                    array[i][j] = i + 1 - j;
                else
                    array[i][j] = 1;
            }
        cout << "Generated matrix:" << endl;
        for (int i = 0; i < a; i++)
        {
            for (int j = 0; j < a; j++)
            {
                cout << array[i][j];
            }
            cout << endl;
        }
        cout << "del the elements on the side:" << endl;
        for (int i = 1; i < a - 1; i++)
        {
            for (int j = 1; j < a - 1; j++)
{
    cout << array[i - 1][j - 1];
}
            cout << endl;
        }
        int sum = 0;
        int i, j;
        for (i = a - 2, j = 1; i >= 1; i--, j++)
        {
            sum += array[i][j];
        }
        cout << "The sum of the diagonal:" << sum << endl;
    }
    return 0;
}

第四题

好数对

题目描述

已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。注:集合中最多有1000个元素,元素最大不超过10000

题解

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, j, t;
    scanf("%d", &n);
    int *a = (int *)malloc(n * sizeof(int));
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int cout = 0;
    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            for (t = 0; t < n; t++)
                if (a[i] + a[j] < a[t])
                  cout++;
        }
    }
    printf("%d", cout);
    free(a);
    return 0;
}

上面的题的难度中等,希望对各位有用,谢谢大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值