目录
下面我将介绍一下我写的每日一练的答案。
第一题
醉酒的狱卒
题目描述
某监狱有一个由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;
}
上面的题的难度中等,希望对各位有用,谢谢大家。