5.哀家要长脑子了!

1. 平均 - 蓝桥云课 (lanqiao.cn)

这个题一开始似懂非懂,感觉有大致思路,实际写的后面感觉不知道该怎么写了

我是这么想的:先把数字和代价分别用两个数组装,然后把代价都加起来,再把代价从大到小排序,但是发现这样数字数组不会跟着一起换,而且还要格外开个数组来记录是否只出现过n/10次,我就我就不知道lalala 好吧这不是似懂非懂这就是不道。

看了题解之后,它的思路是这样的:用一个pair装数组(还有的用结构体也可以)然后先输入把数字定义为second,代价定义为first,这样输入的时候第一个输入的是数字,但在存储的时候代价就是第一个成员;这样排序的时候就不需要再重写比较规则。接着按照代价进行排序,在输入的时候再用一个桶子flag,记录每个数字出现了多少次。在接下来的循环中,遍历这n个数,如果flag[数字] > n/10 就进行代价计算。

#include <bits/stdc++.h>
using namespace std;
const int N = 100020;
// second数 first代价
pair<int,int> a[N];
long long sum;
int flag[10];
 
int main()
{
  int n;
  cin >> n;
  int count =  n / 10;
  for(int i = 0; i < n; i++){
    //先存入数字再存入代价 比如输入:1 2  实际存储:2 1
    cin >> a[i].second >> a[i].first;
    flag[a[i].second]++;
  }

  sort(a, a+n);

  for(int i = 0; i < n; i++){
    if(flag[a[i].second] > count){
      sum += a[i].first;
      flag[a[i].second]--;
    }
  }
  cout << sum;
  return 0;
}

芝士点:

  pair是将两个数据合成一组数据,又不想因此定义结构体,当需要这样的需求时就可以使用pair;另一个应用是,当一个函数需要返回2个数据的时候可以选择pair。pair的实现是一个结构体,主要的两个成员变量是first、second。因为是使用struct而不是class,所以可以直接使用pair的成员变量。

  其标准库类型 -pair类型定义在#include <utility>头文件中,定义如下:

        类模板:templa<class T1, class T2> struct pair

        参数:T1是第一个值的数据类型,T2是第二个值得数据类型

        功能: a. pair将一对值(T1和T2)组合成一个值。

                    b. 这一对值可以具有不同的数据类型

                     c. 这两个值可以分别用pair的两个公有函数first和second访问

初始化:

pair<T1, T2>  p1;

创建一个空的pair对象p1,两个元素类型分别是T1和T2类型

pair<T1, T2>  p1(v1, v2); 

同上,其中first、second成员分别初始化为v1、v2

排序先根据first成员来排序,first成员一致再根据second成员 

2. yi方阵 - 蓝桥云课 (lanqiao.cn)

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n;
  cin >> n;
  int i = 1,j = 2;
  int k = 0;
  while(i++){
    k = pow(i,2);
    j++;
    if(n >= k && j*j > n){
      break;
    }
  }
  cout << i;
  return 0;
}

一道水题,但是我还是花了点时间,主要是注意break的条件。什么时候break,当平方根后一个数字平方也大于目标数n

3. 运动会 - 蓝桥云课 (lanqiao.cn)

这个题考察一个按列遍历

n*m的数组

按列遍历

        for(int j = 0; j < m; j++){

                for(int i = 0; i < n; i++){

                        cout << a[i][j] << " ";

                }

               cout << endl;

        }

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

按列遍历不能写成:

        for(int i = 0; i < n; i++){

                for(int j = 0; j < m; j++){

                        cout << a[j][i] << " ";

                }

               cout << endl;

        }

反正不能写成a[j][i] 如果是方阵的话无所谓

要不然他有些地方本来就没元素就会是零

比如上面这种情况输出题目中的二维数组就会变成这样

5 2 8 0 0
3 4 6 0 0
1 2 3 0 0

正确结果:

5 2 8
3 4 6
1 2 3
5 34 2
12 1 2

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

按行遍历
        for(int i = 0; i < n; i++){

                for(int j = 0; j < m; j ++){

                        //...

                }

        }

在遍历整个n*m的数组中再遍历这个项目也就是列 得出排名:假设运动员都是第一名,遇到比他大的也就是分数高的排名就要往后移动,得分会相应减少。 然后按照所给公式计算所得分数 

for(int j = 0; j < m; j++){
    for(int i = 0; i < n; i++){
        //临时存储正在计算的分数 第i个运动员的第j个项目
        int temp = a[i][j];
        int sum = 0;
    for(int t = 0; t < n; t++){   
        if(temp < a[t][j])
        //算他们的排名
            cnt++;
        }
         // 运动员的总分数
         sum[i] += max(k-i+1, 0);
    }
}
    

4. 平方和拆分 - 蓝桥云课 (lanqiao.cn)

 我是去验证的

把1到2021每个数字用变量i遍历验证:第一个平方数字a从0到a*a<=i 得出第一个平方数字

那么i剩下的是 i - a * a,第二个平方数字b一定在a的范围内,我们只要验证b是不是整数就好了,

验证a * a + b * b == i

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int count = 0;
  int a = 0, b = 0;
  for(int i = 1; i <= 2021; i++){
    for(int a = 0; a*a <= i; a++){
      int j = i - a*a;
      b = sqrt(j);
      if(b*b == j){
        count++;
        break; //找到了就break这个循环,不需要再验证验证了 尽管它有另一种组合    
      }
    }
  }
  cout << count;
  return 0;
}

 5. 最大子矩阵 - 蓝桥云课 (lanqiao.cn)

感情都在注释里面

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int max = 0, index = 0;
  int a[200][200];
    //用一个字符串或者字符数组char x[401]来存储
  string x =
"6985924183938786894117615876963131759284373473483266274834855367125655616786474316121686927432329479135474133499627734472797994592984882468753776983346838791379564934213653657177452192437929387261138293919353216243561277542961447639692577889623397251379473293381443494533129939975611718829888775934996121686889572134852255485345959294726896321249633182425549221359364719193427269656436895944919899246";

  for(int i = 0; i < 20; i++){
    for(int j = 0; j < 20; j++){
        //将字符串转换为整型二维数组
      a[i][j] = x[index++] - '0';
    }
  }

    //注意边界条件,因为子矩阵要整个都在矩阵里面不能越界了
  for(int i = 0; i <= 15; i++){
    for(int j = 0; j <= 15; j++){
      int sum = 0;
        //再遍历循环子矩阵计算子矩阵的和
      for(int k = i; k < i+5; k++){
        for(int m = j; m < j + 5; m++){
          sum += a[k][m];
        }
      }
        //打擂台 找最大值
      if(sum > max){
        max = sum;
      }
    }
  }
  cout << max;
  return 0;
}

芝士点:

        字符到整数的转换,在ASCII编码中,数字字符是连续排列的,例如,字符'0'的ASCII值是48,字符'1'的ASCII值是49,依此类推,知道字符'9'的ASCII值是57。因此,一个数字字符的ASCII值减去字符'0'的ASCII值(即48)会得到该字符所代表的整数值。

例如:

  • 字符'0'转换为整数:'0' - '0' = 48 - 48 = 0
  • 字符'1'转换为整数:'1' - '0' = 49 - 48 = 1
  • 字符'2'转换为整数:'2' - '0' = 50 - 48 = 2
  • .......

其实感觉今天做的都是简单的题,思维小技巧题,但是我就是扯不清啊TT 好伤心好烦 好想变厉害 嘎嘎乱55555555555555555555555555555555555555555555555555555555555555555555555

  • 36
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值