21真题
作者:
Ksiiiii
,
2024-11-27 21:10:45
,
所有人可见
,
阅读 1
马鞍点
/*本题思想为:建立行最大数组和列最大数组分别记录每一行或每一列的
最大值是多少,考虑到一行可能会有多个最大值,设立bool类型flag数组
用于记录所有的鞍点,遍历修改flag数组中的元素,最后讲flag中为true
的元素顺序输出即可*/
#include <iostream>
#include <climits>
using namespace std;
const int N = 11;
const int M = 11;
int main(){
int n,m;
cin >> n >> m;
int a[N][M];
bool flag[N][M] = {false};
int tmp = false;
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
cin >> a[i][j];
}
}
int i_max[N],j_max[M];
for (int i = 1; i <= n; i++) {
i_max[i] = INT_MIN;
}
for (int j = 1; j <= m; j++) {
j_max[j] = INT_MAX;
}
//双循环确定行最大和列最大
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
//这里一定要注意i和j的区别
if(a[i][j] > i_max[i]) i_max[i] = a[i][j];
if(a[i][j] < j_max[j]) j_max[j] = a[i][j];
}
}
//双循环修改flag数组中的值
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
if(a[i][j] == i_max[i] && a[i][j] == j_max[j]) flag[i][j] = true;
}
}
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
if(flag[i][j]){
cout << i <<" "<< j <<" "<< a[i][j] << endl;
tmp = true;
}
}
}
if(!tmp) cout << "NO" <<endl;
return 0;
}
完美数
/*本题思路为嵌套循环完成题目要求,本题其实卡了时间复杂度
其实可以将复杂度降到O(sqrt(n))之内,因为我们只需要遍历
一半的数据就够了,另一半可以由j得到
*/
#include <iostream>
#include <cmath>
using namespace std;
int main(){
for(int n = 2;n <= 10000;n ++) {
int num = 1;
for(int i = 2;i <= sqrt(n);i ++){
int a = n / i;
if(n % i == 0){
num += i + a;
}
}
if(num == n && num != 1) cout << n << " ";
}
return 0;
}
机器人的复制
//这道题比较简单,其实跟斐波那契数列比较像,只要找到规律就行
#include <iostream>
using namespace std;
const int N = 101;
int main(){
int n;
cin >> n;
int a[N];
a[1] = 1;
a[2] = 2;
a[3] = 3;
for(int i = 4;i <= n;i ++){
a[i] = a[i-1] + a[i-3];
}
cout << a[n];
return 0;
}